Nach Spalte ASC sortieren, aber zuerst NULL-Werte?

80

Ich muss eine PostgreSQL-Tabelle nach einem Datums- / Zeitfeld aufsteigend sortieren, z last_updated.

Aber das Feld ist erlaubt leer oder null zu sein , und ich mag Datensätze mit null in last_updatedkommen , bevor nicht-null last_updated.
Ist das möglich?

order by last_updated asc  -- and null last_updated records first ??
mhd
quelle
Nur für den Fall, dass es benötigt wird: postgresql.org/docs/9.0/static/queries-order.html
mhd

Antworten:

164

Postgres stellt die NULLS FIRST | LASTSchlüsselwörter für die ORDER BYKlausel bereit , um genau diesem Bedarf gerecht zu werden:

... ORDER BY last_updated NULLS FIRST

Ein typischer Anwendungsfall ist die absteigende Sortierreihenfolge ( DESC), die die vollständige Umkehrung der aufsteigenden Standardreihenfolge ( ASC) mit Nullwerten zuerst ergibt. Oft nicht wünschenswert - um Nullwerte zuletzt zu erhalten:

... ORDER BY last_updated DESC NULLS LAST

Stellen Sie sicher , dass die Abfrage mit einem Index übereinstimmt:

CREATE INDEX foo_idx ON tbl (last_updated DESC NULLS LAST);

Postgres kann btree-Indizes rückwärts lesen, aber es ist wichtig, wo NULL-Werte angehängt werden.

Erwin Brandstetter
quelle
1
@mhd Du hast nicht nach "postgres sort null null" bei Google gesucht?
David Aldridge
28
Ich tat. So habe ich diese Seite bekommen :)
ibrewster
2
Vielen Dank für Ihre Antwort, PostgreSQL super.
Greatghoul
1
Danke für die Antwort. SQLite3 hat diese Funktion hinzugefügt und vor der Verwendung wollte ich sicherstellen, dass sie mit PostgreSQL kompatibel ist. Es stellt sich heraus, dass es heutzutage Standard ist!
Brad
13

Sie können eine benutzerdefinierte ORDER BY-Anweisung mithilfe einer CASE-Anweisung erstellen.
Die CASE-Anweisung prüft, ob Ihre Bedingung erfüllt ist, und weist Zeilen, die diese Bedingung erfüllen, einen niedrigeren Wert zu als Zeilen, die die Bedingung nicht erfüllen.
An einem Beispiel ist es wahrscheinlich am einfachsten zu verstehen:

  SELECT last_updated 
    FROM your_table 
ORDER BY CASE WHEN last_updated IS NULL THEN 0 ELSE 1 END, 
         last_updated ASC;
mechanisches Fleisch
quelle
1
Auch, aber Sie wissen wahrscheinlich, dass dies ASCdie Standardsortierreihenfolge ist, sodass Sie sie nicht unbedingt eingeben müssen.
mechanisches
3
NULLS FIRSTist auch die ANSI-kompatible Methode, um zuerst Nullen zu schreiben.
a_horse_with_no_name
3
@a_horse_with_no_name In meinem Fall ist dies nützlich, da ich den Wert ignorieren möchte, wenn er nicht null ist, und stattdessen nach einer anderen Spalte sortieren möchte. ( seenAt is nullIch sortiere Benachrichtigungen - zuerst nicht gesehen (dann ), aber wenn gesehen, dann sortiere ich nach createdAtinstaed)
KajMagnus
3
Einverstanden; Ich fand dies nützlich, wenn ich nur sortieren wollte, ob ein Wert vorhanden war oder nicht (in diesem Fall ein Datum) - und dann sekundär nach einem anderen Wert sortieren wollte. NULLS FIRSTwird immer noch nach dem tatsächlichen Wert sortiert, wenn der Wert nicht null war. Das hat den Trick für mich getan. Vielen Dank!
Ben Kreeger