Pergunta

Eu tenho um procedimento armazenado que executa uma instrução SELECT. Eu gostaria que meus resultados ordenados por um campo de data e exibir todos os registros com datas NULL em primeiro lugar e, em seguida, as datas mais recentes.

Os olhares declaração como esta:

SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY [Submission Date] ASC

Agora, isso irá exibir todos os registros com datas NULL submissão do primeiro, mas quando eu chegar ao linhas que têm valores de data neles, eles não são as mais recentes na vista.

Se eu substituir ASC com DESC, então eu recebo as datas na ordem que eu quero, mas os valores nulos estão na parte inferior do meu conjunto de resultados.

Existe alguma maneira para estruturar minha consulta para que eu possa exibir os valores nulos na parte superior e, em seguida, quando há valores de data, para ordená-las descendente mais recente para o mais antigo?

Foi útil?

Solução

@ Chris, você quase tê-lo.

ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC, 
         [Submission Date] DESC

[Edit: #Eppz me pediu para ajustar o código acima, como mostrado atualmente]

Eu pessoalmente prefiro esta muito melhor do que a criação de "números mágicos". Números mágicos são quase sempre um problema esperando para acontecer.

Outras dicas

Você pode fazer algo assim colocar a NULL de na parte inferior:

ORDER BY [Submission Date] IS NULL DESC, [Submission Date] ASC

SQL padrão (ISO / IEC 9075-2: 2003 ou posterior - 2008), prevê:

ORDER BY SomeColumn NULLS FIRST

A maioria dos DBMS realmente não apoiar isso ainda, AFAIK.

try

SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC
OrderBy="ColumnName = NULL desc, ColumnName desc"

Tente este

SELECT a, b, c, [Apresentação Data] DE someView ORDENAR POR isnull ([Submission Date], cast ( '1770/01/01', como data e hora)) ASC

Eu sei que isso é velho, mas quando eu descobri que eu notei a solução aceita, https://stackoverflow.com/a/ 821856/7177892 , poderia ser simplificado, tornando o resultado da instrução CASE ser hoje (GETDATE ()) ou a data real.

Original:

ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC, 
         [Submission Date] DESC

simplificado:

ORDER BY (CASE WHEN [Submission Date] IS NULL 
               THEN GETDATE() 
               ELSE [Submission Date] 
          END) DESC
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top