2009-09-21 16 views
43

Así que Oracle ha NULLS primero, que puedo usar para tener valores nulos ordenados en la parte superior seguido por el valor de mi columna en orden descendente:SQL Server equivalente a NULLS FIRST de Oracle?

ORDER BY date_sent NULLS FIRST 

Lo que es comparable en SQL Server? Hay estas alternativas, asumiendo los valores de fecha son nulos o en el pasado:

ORDER BY ISNULL(date_sent, GETDATE()) DESC 
ORDER BY (CASE WHEN t.setinactive IS NULL THEN 1 ELSE 2 END), t.setinactive DESC 
ORDER BY -CAST(date_sent as int) ASC 

Algún otro?

+2

Posible duplicado de http://stackoverflow.com/questions/821798/order-by-date-showing-nulls-first-then-most-recent-dates –

Respuesta

59

Puede hacer algún truco:

ORDER BY (CASE WHEN [Order] IS NULL THEN 0 ELSE 1 END), [Order] 
+2

Con este truco puede lograr cualquier pedido que desee. Incluso puede imitar la interfaz más general de IComparer encontrada en muchos idiomas. – usr

1

No puede controlar esto, que yo sepa. Y parece que tienes el enfoque correcto con ISNULL.

Con cuerdas, he usado ISNULL(field, '') para el mismo propósito.

+0

El problema con esto es como GMastros dijo ... – Kev

+1

Kev: Todo depende de la naturaleza del problema en cuestión. La pregunta no era "¿es esta la cláusula ORDER BY para usar en todos los casos?", Por lo que el punto de G Mastros es bien conocido, pero no estrictamente en la ruta crítica de la pregunta en sí. Rexem está buscando una forma más global de controlar la clasificación NULL. –

5

caso de uso/Cuando la declaración, por ejemplo:

ORDER BY (case WHEN ColINT IS NULL THEN {maxIntValue} ELSE ColINT END) DESC 

ORDER BY (case WHEN ColVChar IS NULL THEN {maxVCharValue} ELSE ColVChar END) DESC 

ORDER BY (case WHEN ColDateT IS NULL THEN {maxDateTValue} ELSE ColDateT END) DESC 

... y así sucesivamente.

o incluso mejor ya que no le importa cuál es su tipo de columna y el valor máximo.

ORDER BY (case WHEN ColAnyType IS NULL THEN 1 ELSE 0 END) DESC, ColAnyType DESC 
4

Si tiene filas de la tabla con las fechas menos que ahora, y otras filas con fechas mayor que ahora, sus NULLS aparecería en el medio de la lista. En su lugar, probablemente deba usar un valor que nunca se clasificará en el medio de su lista.

Ordenar por IsNull (Date_Sent, '17530101') desc

Nota: Esa fecha es en realidad Jan 1, 1753.

+0

El pedido de IsNull (Date_Sent, '17530101') desc garantizará que mis columnas con un valor date_sent nulo aparezcan en la parte inferior, no en la parte superior. Estás en lo correcto, pero no viajo al futuro para establecer el valor date_sent =) –

+0

Buen punto, pero el principio aún se cumple. Debe usar un valor que no ocurrirá naturalmente en sus datos. Ej .: Ordenar por IsNull (Date_Sent, '99990101') desc –

+0

Totalmente de acuerdo en el uso de un valor centinela. –

3
ORDER BY 
    COALESCE(POSTING_DATE,'1900-01-01 00:00:00.000') 
,OTHER_FIELDS 
+0

No funciona: los nulos son los primeros, pero el resto de las columnas de la fecha no se ordenan en orden DESC. –

3

Esta es una forma alternativa cuando se quiere ajustar la forma en que aparecen los nulos en el orden de clasificación Niega la columna e invierte tu orden de clasificación. Desafortunadamente, necesitarás CASTAR columnas de fecha y hora.

ORDER BY -CAST(date_sent as int) ASC 
+0

Confirmado: los valores nulos están en la parte superior y los valores no nulos están en orden DESC. –

4

Un ejemplo sencillo:

SELECT (CASE WHEN Value1 IS NULL THEN 1 ELSE 0 END) AS ValueIsNull, Value1, Value2, Value3 
FROM TableName 
ORDER BY ValueIsNull DESC, Value1 
11

La respuesta rápida es la siguiente: la mejor solución para cambiar el orden de los valores nulos en los casos necesarios es el aceptado.Sin embargo, sólo tiene que usarlo, o una variación de la misma en los casos necesarios:

  • DESC + NULLS PRIMERO:

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

  • ASC + NULLS ÚLTIMO:

    ORDER BY (CASE WHEN [Order] IS NULL THEN 1 ELSE 0 END), [Order] ASC

  • ASC + NULLS PRIMERO: funciona bien de forma predeterminada

  • DESC + NULLS Últimos: Funciona bien por defecto

Veamos por qué:

Si marca la ORDER BY Clause (Transact-SQL) MSDN docs, y baje hasta ASC | DESC, se puede leer lo siguiente:

ASC | DESC

Especifica que los valores en la columna especificada se deben ordenar en orden ascendente o descendente. ASC ordena desde el valor más bajo hasta el valor más alto. DESC ordena desde el valor más alto al valor más bajo. ASC es el orden de clasificación predeterminado. Los valores nulos se tratan como los valores más bajos posibles.

De manera predeterminada, si especifica el orden ASC, funciona como NULLS FIRST. Y, si especifica DESC, funciona como NULLS LAST.

lo que sólo tendrá que hacer para cambiar el comportamiento NULLS FIRST en DESC orden, y para NULLS LAST en ASC orden.

En mi humilde opinión, la mejor solución para cambiar el orden de nulos en los casos necesarios es la aceptada, pero la he incluido adaptada a los diferentes casos al principio de mi respuesta.

Cuestiones relacionadas