Ich habe eine SQL-Tabelle mit einem Datum / Uhrzeit-Feld. Das betreffende Feld kann null sein. Ich habe eine Abfrage und möchte, dass die Ergebnisse aufsteigend nach dem Datum / Uhrzeit-Feld sortiert werden. Ich möchte jedoch Zeilen, bei denen das Datum / Uhrzeit-Feld am Ende der Liste und nicht am Anfang Null ist.
Gibt es einen einfachen Weg, dies zu erreichen?
sql
sorting
sql-order-by
David Božjak
quelle
quelle
Antworten:
quelle
order by case when MyDate is null then 1 else 0 end
ist eine wirklich lange Art zu sagenORDER BY MyDate IS NULL
order by 0
wird als Spaltenindex interpretiert und die Spaltenindizes basieren auf 1. Um eine Abfrage nach der 3. Spalte zu sortieren, können Sie sagenorder by 3
(was eine schreckliche Idee für Produktionsabfragen ist), aber sehr praktisch (wie es ist*
) beim Experimentieren.(Ein bisschen zu spät, aber das wurde überhaupt nicht erwähnt)
Sie haben Ihr DBMS nicht angegeben.
In Standard-SQL (und den meisten modernen DBMS wie Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB und H2) können Sie Folgendes angeben
NULLS LAST
oderNULLS FIRST
:Verwenden Sie
NULLS LAST
, um sie bis zum Ende zu sortieren:quelle
NULLS FIRST
undNULLS LAST
wurden in SQL: 2003 hinzugefügt, es ist jedoch keine Standardimplementierung für die verschiedenen DMBS verfügbar. Verwenden Sie je nach DatenbankmodulORDER BY expr some_column DESC NULLS LAST
(Oracle),ORDER BY ISNULL(some_column, 1), some_column ASC
(MSSQL) oderORDER BY ISNULL(some_column), some_column ASC
(MySQL mit einer anderen ISNULL () -Implementierung).ASC
/DESC
mit Nullen, andere tun es. Die einzige Möglichkeit, dies sicherzustellen, ist die Verwendung,NULL FIRST/LAST
wenn das DBMS dies unterstützt. Darin dokumentiert, was Sie vorhaben. Die Verwendung vonisnull()
oder anderer Funktionen ist eine Problemumgehung für die fehlende Unterstützung fürNULLS FIRST/LAST
(die von Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB und H2 unterstützt wird)expr
Schlüsselwort erfordern, wenn NULLS FIRST / LAST verwendet wird. Und danke, dass die Nullen zuerst / zuletzt angezeigt werden und von Datenbanktyp zu Typ variieren, wusste das nicht!NULLS LAST
in meiner MySQL-Datenbank nicht funktioniert.Ich bin auch nur darauf gestoßen und das Folgende scheint mir bei MySQL und PostgreSQL zu helfen:
wie unter https://stackoverflow.com/a/7055259/496209 zu finden
quelle
IS NULL
undIS NOT NULL
hat nicht funktioniert in meiner MySQL - Datenbank.quelle
Sie können die integrierte Funktion verwenden, um wie folgt nach null oder nicht null zu suchen. Ich teste es und es funktioniert gut.
select MyDate from MyTable order by ISNULL(MyDate,1) DESC, MyDate ASC;
quelle
ISNULL(MyDate) DESC, MyDate ASC
, aber es wurde nicht in der richtigen Reihenfolge sortiert.Wenn Ihr Motor dies zulässt
ORDER BY x IS NULL, x
oderORDER BY x NULLS LAST
verwendet. Wenn dies nicht der Fall ist, können diese helfen:Wenn Sie nach einem numerischen Typ sortieren, können Sie Folgendes tun: (Ausleihen des Schemas aus einer anderen Antwort .)
Jede Nicht-Null-Zahl wird zu 0, und Nullen werden zu 1, wodurch die Nullen zuletzt sortiert werden.
Sie können dies auch für Zeichenfolgen tun:
Weil
'a'
>''
.Dies funktioniert sogar mit Datumsangaben, indem ein nullbares int erzwungen wird und die oben beschriebene Methode für Ints verwendet wird:
(Stellen wir uns vor, das Schema hat HireDate.)
Diese Methoden vermeiden das Problem, einen "Maximalwert" für jeden Typ erstellen oder verwalten zu müssen oder Abfragen zu korrigieren, wenn sich der Datentyp (und das Maximum) ändert (beide Probleme, unter denen andere ISNULL-Lösungen leiden). Außerdem sind sie viel kürzer als ein Fall.
quelle
Wenn Ihre Bestellspalte numerisch ist (wie ein Rang), können Sie sie mit -1 multiplizieren und dann absteigend sortieren. Es behält die Reihenfolge bei, die Sie erwarten, setzt aber zuletzt NULL.
quelle
Siehe diesen Blog-Beitrag .
quelle
Vielen Dank an RedFilter für die hervorragende Lösung des Fehlerproblems beim Sortieren von nullbaren Datums- / Uhrzeitfeldern.
Ich verwende die SQL Server-Datenbank für mein Projekt.
Das Ändern des Datetime-Nullwerts in '1' löst das Problem der Sortierung nach Datetime-Datentypspalte. Wenn wir jedoch eine Spalte mit einem anderen Datentyp als datetime haben, kann diese nicht verarbeitet werden.
Um eine varchar-Spaltensortierung zu handhaben, habe ich versucht, 'ZZZZZZZ' zu verwenden, da ich wusste, dass die Spalte keine Werte hat, die mit 'Z' beginnen. Es hat wie erwartet funktioniert.
In den gleichen Zeilen habe ich Maximalwerte +1 für int und andere Datentypen verwendet, um die Sortierung wie erwartet zu erhalten. Dies gab mir auch die erforderlichen Ergebnisse.
Es wäre jedoch immer ideal, im Datenbankmodul selbst etwas einfacher zu machen, das Folgendes bewirken könnte:
Wie in der Antwort von a_horse_with_no_name erwähnt.
quelle
In Oracle können Sie Folgendes verwenden
NULLS FIRST
oderNULLS LAST
: Gibt an, dass NULL-Werte vor / nach Nicht-NULL-Werten zurückgegeben werden sollen:Zum Beispiel:
Ref: http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html
quelle
Wenn Sie MariaDB verwenden, wird in der Dokumentation zu NULL-Werten Folgendes erwähnt .
Das Obige zeigt zwei Möglichkeiten zum Ordnen nach NULL-Werten. Sie können diese auch mit den Schlüsselwörtern ASC und DESC kombinieren. Der andere Weg, um zuerst die NULL-Werte zu erhalten, wäre beispielsweise:
quelle
Die Lösung mit dem "Fall" ist universell, verwenden Sie dann jedoch nicht die Indizes.
In meinem Fall brauchte ich Leistung.
quelle
UNION ALL
.Verwenden Sie die NVL-Funktion
Hier ist die Alternative von NVL in den bekanntesten DBMS
quelle
quelle