web-dev-qa-db-fra.com

ORDER BY DATE indiquant les dates NULLS en premier, puis les plus récentes

J'ai une procédure stockée qui exécute une instruction select. Je voudrais que mes résultats soient classés par un champ de date et que tous les enregistrements avec des dates NULL en premier, puis les plus récents, soient affichés.

La déclaration ressemble à ceci:

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

Désormais, tous les enregistrements avec les dates de soumission NULL seront affichés en premier lieu, mais lorsque j'arrive aux lignes contenant des valeurs de date, elles ne sont pas les dates les plus récentes de la vue.

Si je remplace ASC par DESC, j'obtiens les dates dans l'ordre que je veux, mais les valeurs NULL sont au bas de mon jeu de résultats.

Existe-t-il un moyen de structurer ma requête de manière à ce que je puisse afficher les valeurs NULL en haut, puis lorsqu'il existe des valeurs de date, pour les classer par ordre décroissant, du plus récent au plus ancien?

55
Eppz

@ Chris, vous l'avez presque.

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

[Edit: #Eppz m'a demandé de modifier le code ci-dessus comme actuellement]

Personnellement, je préfère cela beaucoup mieux que de créer des "nombres magiques". Les nombres magiques sont presque toujours un problème en attente de se produire.

95
Euro Micelli

Vous pouvez faire quelque chose comme ceci: mettez la valeur NULL en bas:

ORDER BY [Submission Date] IS NULL DESC, [Submission Date] ASC
24
Chris Bartow

La norme SQL (ISO/IEC 9075-2: 2003 ou ultérieure - 2008) prévoit:

ORDER BY SomeColumn NULLS FIRST

La plupart des SGBD ne supportent pas encore cela, autant que je sache.

17

essayer

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

essaye ça

SÉLECTIONNER a, b, c, [Date de soumission] DE une vue COMMANDÉ PAR isnull ([Date de soumission], cast ('1770/01/01' en tant que date/heure))) ASC

0
littlechris

Je sais que c'est vieux, mais quand je l'ai trouvée, j'ai remarqué que la solution acceptée, https://stackoverflow.com/a/821856/7177892 , pourrait être simplifiée en rendant le résultat de l'instruction CASE aujourd'hui GETDATE ()) ou la date réelle.

Original:

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

Simplifié:

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

J'ai une autre suggestion qui pourrait être plus simple que toutes les autres:

Pour SQL Server, la plupart des options ne fonctionnent pas, sauf celles du cas.

J'ai trouvé que cela fonctionnait vraiment très bien pour moi: ORDER BY ISNULL (Submission_Date, GETDATE ()) DESC

Dans le bit d'ordre de la requête, j'attribue la valeur GETDATE () aux valeurs Submittion_Date qui sont null et l'ordre est correctement affiché.

0
Marco Leite