Pregunta

Tengo un procedimiento almacenado que ejecuta una instrucción select. Me gustaría ordenar mis resultados por un campo de fecha y mostrar todos los registros con fechas NULAS primero y luego las fechas más recientes.

La declaración se ve así:

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

Ahora, esto mostrará primero todos los registros con fechas de envío NULL, pero cuando llego a las filas que tienen valores de fecha, no son las fechas más recientes en la vista.

Si reemplazo ASC con DESC, entonces obtengo las fechas en el orden que quiero, pero los valores NULL están en la parte inferior de mi conjunto de resultados.

¿Hay alguna forma de estructurar mi consulta para que pueda mostrar los valores nulos en la parte superior y luego cuando hay valores de fecha, para ordenar que desciendan de más recientes a más antiguos?

¿Fue útil?

Solución

@Chris, casi lo tienes.

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

[Editar: #Eppz me pidió que modifique el código anterior como se muestra actualmente]

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 suceder.

Otros consejos

Puede hacer algo como esto ponga los NULL en la parte inferior:

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

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

ORDER BY SomeColumn NULLS FIRST

La mayoría de los DBMS aún no lo admiten, AFAIK.

prueba

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"

prueba esto

  

SELECCIONE a, b, c, [Fecha de envío]   DESDE   someView   ORDENAR POR   isnull ([Fecha de envío], emitido ('1770/01/01' como fecha y hora)) ASC

Sé que esto es viejo, pero cuando lo encontré, noté la solución aceptada, https://stackoverflow.com/a/ 821856/7177892 , podría simplificarse haciendo que el resultado de la declaración CASE sea 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top