Eu tenho uma tabela SQL com um campo de data e hora. O campo em questão pode ser nulo. Eu tenho uma consulta e quero que os resultados sejam classificados de forma crescente pelo campo datetime, no entanto, quero linhas em que o campo datetime é nulo no final da lista, não no início.
Existe uma maneira simples de conseguir isso?
sql
sorting
sql-order-by
David Božjak
fonte
fonte
Respostas:
fonte
order by case when MyDate is null then 1 else 0 end
é realmente uma maneira muito longa de dizer #ORDER BY MyDate IS NULL
order by 0
é interpretado como um índice de coluna e os índices da coluna são baseados em 1. Para classificar uma consulta pela 3ª coluna, você pode dizerorder by 3
(o que é uma péssima idéia para consultas de produção), mas muito útil (como é*
) ao experimentar.(Um "pouco" tarde, mas isso não foi mencionado)
Você não especificou seu DBMS.
No SQL padrão (e nos DBMS mais modernos, como Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB e H2), você pode especificar
NULLS LAST
ouNULLS FIRST
:Use
NULLS LAST
para classificá-los até o fim:fonte
NULLS FIRST
eNULLS LAST
foram adicionados no SQL: 2003, mas não há implementação padrão disponível nos diferentes DMBS '. Dependendo do mecanismo do banco de dados, useORDER BY expr some_column DESC NULLS LAST
(Oracle),ORDER BY ISNULL(some_column, 1), some_column ASC
(MSSQL) ouORDER BY ISNULL(some_column), some_column ASC
(MySQL com uma implementação ISNULL () diferente).ASC
/DESC
com nulos, outros sim. Portanto, a única maneira de garantir isso é usarNULL FIRST/LAST
se o DBMS suportar. Nele documenta o que você pretende. O uso deisnull()
ou outras funções é uma solução para o apoio faltando paraNULLS FIRST/LAST
(que é suportado pela Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB e H2)expr
palavra - chave ao usar NULLS PRIMEIRO / ÚLTIMO. E obrigado por os nulos serem mostrados primeiro / último variando de tipo para banco de dados, não sabia disso!NULLS LAST
não funcionou no meu banco de dados MySQL.Eu também me deparei com isso e o seguinte parece fazer o truque para mim, no MySQL e no PostgreSQL:
como os encontrados em https://stackoverflow.com/a/7055259/496209
fonte
IS NULL
eIS NOT NULL
não funcionou no meu banco de dados MySQL.fonte
Você pode usar a função interna para verificar se é nulo ou não nulo, como abaixo. Eu testo e está funcionando bem.
select MyDate from MyTable order by ISNULL(MyDate,1) DESC, MyDate ASC;
fonte
ISNULL(MyDate) DESC, MyDate ASC
, mas ele não foi classificado na ordem correta.Se o seu mecanismo permitir
ORDER BY x IS NULL, x
ouORDER BY x NULLS LAST
usar isso. Mas se isso não acontecer, isso pode ajudar:Se você estiver classificando por um tipo numérico, faça o seguinte: (Emprestando o esquema de outra resposta .)
Qualquer número não nulo torna-se 0 e nulos tornam-se 1, que classifica os nulos por último.
Você também pode fazer isso para seqüências de caracteres:
Porque
'a'
>''
.Isso funciona mesmo com datas coagindo para um int nulo e usando o método para ints acima:
(Vamos fingir que o esquema tem HireDate.)
Esses métodos evitam a questão de ter que criar ou gerenciar um valor "máximo" de cada tipo ou corrigir consultas se o tipo de dados (e o máximo) mudar (ambos os problemas que outras soluções ISNULL sofrem). Além disso, eles são muito mais curtos que um CASE.
fonte
Quando a coluna do seu pedido é numérica (como uma classificação), você pode multiplicá-la por -1 e, em seguida, decrescente. Ele manterá a ordem que você está esperando, mas colocará NULL por último.
fonte
Veja esta postagem do blog .
fonte
Agradecemos à RedFilter por fornecer uma excelente solução para a questão de erros da classificação do campo data e hora anulável.
Estou usando o banco de dados SQL Server para o meu projeto.
Alterar o valor nulo de data e hora para '1' resolve o problema de classificação da coluna de tipo de dados de data e hora. No entanto, se tivermos uma coluna com outro tipo de dados datetime, ele falhará no tratamento.
Para lidar com uma classificação de colunas varchar, tentei usar 'ZZZZZZZ', pois sabia que a coluna não tem valores começando com 'Z'. Funcionou como esperado.
Nas mesmas linhas, usei valores máximos +1 para int e outros tipos de dados para obter a classificação conforme o esperado. Isso também me deu os resultados necessários.
No entanto, sempre seria ideal obter algo mais fácil no próprio mecanismo de banco de dados que pudesse fazer algo como:
Conforme mencionado na resposta fornecida por a_horse_with_no_name.
fonte
No Oracle, você pode usar
NULLS FIRST
ouNULLS LAST
: especifica que os valores NULL devem ser retornados antes / depois dos valores não NULL:Por exemplo:
Ref: http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html
fonte
Se você estiver usando o MariaDB, eles mencionam o seguinte na documentação de Valores NULL .
A tabela acima mostra duas maneiras de ordenar por valores NULL. Você também pode combiná-los com as palavras-chave ASC e DESC. Por exemplo, a outra maneira de obter os valores NULL primeiro seria:
fonte
A solução que usa o "caso" é universal, mas não use os índices.
No meu caso, eu precisava de desempenho.
fonte
UNION ALL
.USE a função NVL
Aqui está a alternativa do NVL no DBMS mais famoso
fonte
fonte