2009-05-04 1 views
51

Ich habe eine gespeicherte Prozedur, die eine Select-Anweisung ausführt. Ich möchte, dass meine Ergebnisse nach einem Datumsfeld geordnet sind und alle Datensätze mit NULL-Daten zuerst und dann die letzten Daten anzeigen.ORDER BY DATE zeigt NULL zuerst und dann die letzten Daten

Die Anweisung sieht wie folgt aus:

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

Jetzt werden diese alle Datensätze angezeigt werden mit NULL Submission ersten Termine, aber wenn ich auf die Zeilen erhalten, die Datumswerte in ihnen, sie sind nicht die letzten Tage, in die Aussicht.

Wenn ich ASC mit DESC ersetze, dann bekomme ich die Daten in der Reihenfolge, die ich will, aber die NULL-Werte sind am Ende meiner Ergebnismenge.

Gibt es eine Möglichkeit, meine Abfrage zu strukturieren, so dass ich die Nullwerte am oberen Rand anzeigen kann und wenn es dann Datumswerte gibt, um sie absteigend am längsten zu sortieren?

Antwort

85

@Chris, Sie haben es fast schon.

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

[Edit: #Eppz mich gebeten, den Code oben als zur Zeit gezeigt zwicken]

ich persönlich diese lieber viel besser als „magische Zahlen“ zu schaffen. Magische Zahlen sind fast immer ein Problem, auf das man warten muss.

+4

Warum sich mit DESC beschäftigen? Wechseln Sie einfach Ihre 0 und 1. –

+0

Klar, aber ich habe versucht, meine Änderungen so nah wie möglich an Chris Vorschlag zu halten. –

+0

Ich habe tatsächlich nicht auf die Tags gesehen, um zu sehen, dass es für sql2000 war. Mine sollte in MySQL arbeiten. :) –

3

versuchen

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

9999/99/99 mit einem Fehler aus, da es nicht zu einem Zeitpunkt analysiert werden kann. – Eppz

+0

Ich würde diese Lösung anstelle des Falls verwenden. – Ionic

+0

Kann problemlos in LINQ – yoohoo

21

Sie können etwas tun, wie dies die NULL ist am Boden setzen:

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

+1 verwendet werden dies war die einzige Antwort, die in Access SQL für mich funktionierte. –

+1

Dies funktionierte auch in SQLite. – IAmKale

+0

Gibt es einen Grund, warum Sie die eckigen Klammern haben? – AndrewBramwell

0

diese

versuchen

SELECT a, b, c, [Erstellungsdatum ] VON someView BESTELLNUMMER isnull ([Submissi am Datum], Cast ('1770/01/01' als Datetime)) ASC

+1

danke für Besetzung ('2079/01/01' als Datetime) Teil ! – Sadegh

14

Standard-SQL (ISO/IEC 9075-2: 2003 oder später - 2008) sieht Folgendes vor:

ORDER BY SomeColumn NULLS FIRST 

meisten DBMS eigentlich nicht, dies noch unterstützen, AFAIK.

+1

Danke für diesen Tipp, funktioniert mit Oracle 11g. –

+2

Auch mit PostgreSQL 9.2.1 arbeiten. –

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

Ich weiß, das alt ist, aber wenn ich es gefunden bemerkte ich die akzeptierte Lösung, https://stackoverflow.com/a/821856/7177892 könnte, indem sie das Ergebnis der CASE-Anweisung vereinfacht werden entweder heute (GETDATE()) oder dem aktuellen Datum.

Original:

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

Simplified:

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

Diese Vereinfachung funktioniert nicht wie sie ist, wenn Sie Datensätze mit dem heutigen oder zukünftigen Datum haben. In diesem Fall könnten Sie von GETDATE() zu DATEADD() wechseln und einige obszöne große Anzahl von Tagen oder Jahren zum aktuellen Datum hinzufügen. – nconantj

Verwandte Themen