2009-05-04 34 views
51

Tengo un procedimiento almacenado que se ejecuta una instrucción de selección. Me gustaría que mis resultados sean ordenados por un campo de fecha y mostrar primero todos los registros con fechas NULL y luego las fechas más recientes.Ordenar por Fecha mostrando NULLS primero y luego las fechas más recientes

La declaración tiene el siguiente aspecto:

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

Ahora bien, esto va a mostrar todos los registros con NULL las fechas de presentación en primer lugar, pero cuando llego a filas que tienen valores de fecha en ellos, no son las fechas más recientes en la vista.

Si sustituyo con ASC DESC, cuando me siento las fechas, en el orden que quiera, pero los valores NULL se encuentran en el fondo de mi conjunto de resultados.

¿Hay alguna manera de estructurar mi consulta para que pueda mostrar los valores nulos en la parte superior y luego, cuando existen valores de fecha, para ordenarlos descendente más reciente al más antiguo?

Respuesta

85

@Chris, casi lo tiene.

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

[Editar: #Eppz me pidió que modificar el código anterior se muestra en la actualidad]

yo personalmente prefiero esto mucho mejor que crear "números mágicos". Los números mágicos son casi siempre un problema a la espera de que suceda.

+4

¿Por qué molestarse con DESC? Simplemente cambie su 0 y 1. –

+0

Claramente, pero estaba tratando de mantener mis ediciones tan cerca de la sugerencia de Chris como sea posible. –

+0

En realidad, no miré las etiquetas para ver si era para sql2000. El mío debería funcionar en MySQL. :) –

3

tratar

SELECT a,b,c,[Submission Date] 
FROM someView 
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC 
+0

9999/99/99 con lanzar un error, ya que no se puede analizar a una fecha. – Eppz

+0

Usaría esta solución en lugar del estuche. – Ionic

+0

puede utilizar fácilmente en LINQ – yoohoo

21

Puede hacer algo como esto puso el NULL de en la parte inferior:

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

1 esta fue la única respuesta que trabajaba en el acceso a SQL para mí. –

+1

Esto también funcionó en SQLite. – IAmKale

+0

¿Hay alguna razón por la que tenga los paréntesis cuadrados? – AndrewBramwell

0

probar esto

SELECT a, b, c, [Fecha de Envío ] DE someView ORDER BY isnull ([Submissi en fecha], emitir ('1770/01/01' como fecha y hora)) ASC

+1

gracias por el elenco ('2079/01/01' como fecha y hora) parte ! – Sadegh

14

estándar SQL (ISO/IEC 9075-2: 2003 o posterior - 2008) establece:

ORDER BY SomeColumn NULLS FIRST 

La mayoría de los DBMS en realidad no son compatibles con esta, sin embargo, que yo sepa.

+1

Gracias por este consejo, funciona con Oracle 11g. –

+2

También trabajando con PostgreSQL 9.2.1. –

1
OrderBy="ColumnName = NULL desc, ColumnName desc" 
0

Sé que esto es viejo, pero cuando lo encontré me di cuenta de la solución aceptada, https://stackoverflow.com/a/821856/7177892, podría simplificarse haciendo que el resultado de la sentencia CASE ser hoy (GETDATE()) o la fecha 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 
+1

Esta simplificación no funcionará como está si tiene registros con la fecha de hoy o las fechas futuras. En ese caso, podría cambiar de GETDATE() a DATEADD() y agregar un número obscenamente grande de días o años a la fecha actual. – nconantj

Cuestiones relacionadas