Question

J'ai une procédure stockée qui exécute une instruction select. Je souhaite que mes résultats soient classés par 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

Ceci affichera d'abord tous les enregistrements avec des dates de soumission NULL, 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 quelconque de structurer ma requête afin que je puisse afficher les valeurs NULL en haut, puis, lorsqu'il existe des valeurs de date, les classer par ordre décroissant, du plus récent au plus ancien?

Était-ce utile?

La solution

@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 tel qu'il est actuellement affiché]

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.

Autres conseils

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

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

Le SQL standard (ISO / CEI 9075-2: 2003 ou ultérieur - 2008) prévoit:

ORDER BY SomeColumn NULLS FIRST

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

essayer

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"

essayez ceci

  

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

Je sais que c'est vieux, mais quand je l'ai trouvée, j'ai remarqué la solution acceptée, https://stackoverflow.com/a/ 821856/7177892 , pourrait être simplifié en faisant en sorte que le résultat de l'instruction CASE soit 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top