Classifique os valores NULL no final de uma tabela

96

Existe uma maneira com o PostgreSQL de classificar as linhas com NULLvalores nos campos até o final da tabela selecionada?

Gostar:

SELECT * FROM table ORDER BY somevalue, PUT_NULL_TO_END
Helle
fonte

Respostas:

177

Em primeiro lugar, os valores NULL são classificados por último na ordem crescente padrão . Você não precisa fazer nada extra.

O problema se aplica à ordem decrescente , que é o inverso perfeito e, portanto, classifica os valores NULL primeiro. A solução apontada por @Mosty foi introduzida com PostgreSQL 8.3 :

ORDER BY somevalue DESC NULLS LAST

Para PostgreSQL 8.2 e mais antigo ou outro RDBMS sem este recurso SQL padrão, você pode substituir:

ORDER BY (somevalue IS NULL), somevalue DESC

FALSEclassifica antes TRUE, então os valores NULL vêm por último, como no exemplo acima.

Resposta posterior relacionada:

Erwin Brandstetter
fonte
2
IMHO, na maioria dos aplicativos do mundo real, você deseja que os valores nulos durem qualquer que seja a ordem. Por exemplo, classificar DESC em um carimbo de data / hora opcional, nome, sobrenome, ... então acho que é realmente suspeito, embora pareça fazer sentido que matematicamente a ordem DESC seja o oposto de ASC. Talvez os nulos devam estar apenas em uma categoria própria e não devam ser afetados por ASC, DESC e sempre por último, que teria sido um padrão melhor.
Christophe Roussy
Isso pode afetar os índices se eles forem DESC. Talvez você possa adicionar uma observação sobre isso também? postgresql.org/message-id/…
Christophe Roussy
@ChristopheRoussy: os índices que correspondem à ordem de classificação são tocados na resposta vinculada acima.
Erwin Brandstetter
3
Pessoalmente, acho que o padrão deveria ser o oposto: os NULLs vêm primeiro em ordem crescente e por último em ordem decrescente. Isso é muito mais intuitivo, pois NULL é o valor "menor".
Stephen
1
Para pessoas que vêm de MYSQL, isso é um lol? Por que foi construído assim em primeiro lugar? OU o Mysql otimizou demais o resultado
CodeGuru