2009-09-21 7 views
43

Alors Oracle a NULLS FIRST, que je peux utiliser pour avoir des valeurs nulles triées en haut suivi de ma valeur de la colonne dans l'ordre décroissant:SQL Server équivalent à NULLS FIRST d'Oracle?

ORDER BY date_sent NULLS FIRST 

Ce qui est comparable dans SQL Server? Il existe ces alternatives, en supposant que les valeurs de date sont NULL ou dans le passé:

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 

Autres?

+2

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

Répondre

59

Vous pouvez faire un truc:

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

Avec cette astuce, vous pouvez réaliser n'importe quelle commande que vous voulez. Vous pouvez même imiter l'interface IComparer plus générale trouvée dans de nombreuses langues. – usr

1

Vous ne pouvez pas contrôler cela, à ma connaissance. Et il semble que vous ayez la bonne approche avec ISNULL.

Avec les chaînes, j'ai utilisé ISNULL(field, '') dans le même but.

+0

Le problème est que GMastros a dit ... – Kev

+1

Kev: Tout dépend de la nature du problème. La question n'était pas "est-ce la clause ORDER BY à utiliser dans tous les cas?", Et donc le point G Mastros est bien noté mais pas strictement sur le chemin critique de la question elle-même. rexem recherche une manière plus globale de contrôler le tri NULL. –

5

Cas d'utilisation/Lorsque la déclaration, par exemple:

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 

... et ainsi de suite.

ou encore mieux car vous ne vous souciez pas du type de colonne et de la valeur maximale.

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

Si vous avez des lignes de votre table avec des dates moins que maintenant, et d'autres lignes avec des dates plus que maintenant, vos NULLS apparaissent dans le milieu de la liste. Au lieu de cela, vous devriez probablement utiliser une valeur qui ne sera jamais triée au milieu de votre liste.

Trier par IsNull (Date_Sent, '17530101') desc

Note: Cette date est en fait 1 jan 1753.

+0

L'ordre de IsNull (Date_Sent, '17530101') desc permettrait de faire en sorte que mes colonnes avec une valeur null_sent apparaissent en bas, pas en haut. Vous avez raison, mais je ne voyage pas dans le futur pour définir la valeur date_sent =) –

+0

Bon point, mais le principe est toujours valable. Vous devez utiliser une valeur qui ne se produira pas naturellement dans vos données. Ex: Ordre par IsNull (Date_Sent, '99990101') desc –

+0

Totalement d'accord sur l'utilisation d'une valeur sentinelle. –

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

Ne fonctionne pas - les valeurs null sont les premières, mais le reste des colonnes date_sent ne sont pas triées dans l'ordre DESC. –

3

Ceci est une autre façon quand vous voulez régler la nulls apparaissent dans l'ordre de tri. Annulez la colonne et inversez votre ordre de tri. Malheureusement, vous auriez besoin de colonnes CAST dateTime.

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

Confirmé: les valeurs NULL sont en haut et les valeurs non NUL sont dans l'ordre DESC. –

4

Un exemple simple:

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 réponse rapide est la suivante: la meilleure solution pour changer l'ordre des valeurs nulles dans les cas nécessaires est celui qui est accepté.Mais il suffit de l'utiliser, ou une variante de celui-ci dans les cas nécessaires:

  • DESC + NULLS FIRST:

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

  • ASC + NULLS LAST:

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

  • ASC + NULLS FIRST: cela fonctionne bien par défaut

  • DESC + NULLS DERNIERS: il fonctionne très bien par défaut

Voyons voir pourquoi:

Si vous cochez la ORDER BY Clause (Transact-SQL) MSDN docs, et faites défiler jusqu'à ASC | DESC, vous pouvez lire ceci:

ASC | DESC

Spécifie que les valeurs de la colonne spécifiée doivent être triées par ordre croissant ou décroissant. ASC trie de la valeur la plus basse à la valeur la plus élevée. DESC trie de la valeur la plus élevée à la valeur la plus faible. ASC est l'ordre de tri par défaut. Les valeurs nulles sont traitées comme les valeurs les plus basses possibles.

Ainsi, par défaut si vous spécifiez ASC ordre, cela fonctionne comme NULLS FIRST. Et, si vous spécifiez DESC, cela fonctionne comme NULLS LAST.

Alors il vous suffit de faire changer le comportement pour NULLS FIRST dans DESC ordre et pour NULLS LAST dans ASC ordre.

IMHO, la meilleure solution pour changer l'ordre des nulls dans les cas nécessaires est acceptée, mais je l'ai inclus adapté aux différents cas au début de ma réponse.