2009-05-04 11 views
51

J'ai une procédure stockée qui exécute une instruction select. Je voudrais que mes résultats soient ordonnés par un champ de date et affichent d'abord tous les enregistrements avec des dates NULL, puis les dates les plus récentes.ORDRE PAR DATE montrant les premières dates NULLS puis les plus récentes

La déclaration ressemble à ceci:

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

Maintenant, cela affichera tous les enregistrements avec NULL Dates de soumission d'abord, mais quand je reçois aux lignes qui ont des valeurs de date à eux, ils ne sont pas les plus récentes dates la vue.

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

Existe-t-il un moyen de structurer ma requête pour que je puisse afficher les valeurs nulles en haut et ensuite quand il y a des valeurs de date, pour les ordonner de la plus récente à la plus ancienne?

Répondre

85

@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 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 qui attend de se produire.

+4

Pourquoi s'embêter avec DESC? Changez simplement 0 et 1. –

+0

Clairement, mais j'essayais de garder mes modifications aussi proches que possible de la suggestion de Chris. –

+0

En fait, je n'ai pas regardé les tags pour voir que c'était pour sql2000. Le mien devrait fonctionner en MySQL. :) –

3

essayer

SELECT a,b,c,[Submission Date] 
FROM someView 
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC 
+0

9999/99/99 avec jeter une erreur car il ne peut pas être analysé à une date. – Eppz

+0

Je voudrais utiliser cette solution au lieu de l'affaire. – Ionic

+0

Peut facilement utiliser dans LINQ – yoohoo

21

Vous pouvez faire quelque chose comme ceci mis au fond de la valeur NULL:

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

+1 c'était la seule réponse qui a fonctionné dans Access SQL pour moi. –

+1

Cela a également fonctionné dans SQLite. – IAmKale

+0

Y a-t-il une raison pour laquelle vous avez les parenthèses carrées? – AndrewBramwell

0

essayer cette

SELECT a, b, c, [Date de dépôt ] À PARTIR DE someView COMMANDER PAR isnull ([Soumis on Date], cast ('1770/01/01' comme datetime)) ASC

+1

merci pour la distribution ('2079/01/01' comme datetime) partie ! – Sadegh

14

standard SQL (ISO/CEI 9075-2: 2003 ou plus tard - 2008) prévoit:

ORDER BY SomeColumn NULLS FIRST 

La plupart des SGBD ne prennent pas en charge ce fait encore, autant que je sache.

+1

Merci pour cette astuce, fonctionne avec Oracle 11g. –

+2

Fonctionne également avec PostgreSQL 9.2.1. –

1
OrderBy="ColumnName = NULL desc, ColumnName desc" 
0

Je sais que c'est vieux, mais quand je l'ai trouvé, j'ai remarqué la solution retenue, https://stackoverflow.com/a/821856/7177892, pourrait être simplifié en faisant 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 
+1

Cette simplification ne fonctionnera pas telle quelle si vous avez des enregistrements avec la date d'aujourd'hui ou des dates futures. Dans ce cas, vous pouvez passer de GETDATE() à DATEADD() et ajouter un nombre de jours ou d'années obscènes à la date actuelle. – nconantj

Questions connexes