it-swarm.com.de

PostgreSQL-Sortierung nach Datum / Uhrzeit aufsteigend, null zuerst?

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

Aber dieses Feld darf leer oder null sein und ich möchte Datensätze mit null in last_updated come before non-null last_updated.
Ist das möglich?

order by last_updated asc /* and null last_updated records first ?? */
68
mhd

Postgres liefert das NULLS FIRST | LAST Schlüsselwörter für das ORDER BY-Klausel, um genau dieses Bedürfnis zu befriedigen:

... ORDER BY last_updated NULLS FIRST

Ein typisch Anwendungsfall ist mit absteigender Sortierreihenfolge (DESC), die die vollständige Inversion ergibt der aufsteigenden Standardreihenfolge (ASC) mit Nullwerten zuerst. Oftmals nicht wünschenswert - um Nullwerte als letztes beizubehalten:

... ORDER BY last_updated DESC NULLS LAST

Um die Abfrage mit einem Index zu unterstützen, stellen Sie sicher, dass dieser ü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.

135

Sie können ein benutzerdefiniertes ORDER BY mit einer CASE-Anweisung erstellen.
Die CASE-Anweisung überprüft Ihre Bedingung und weist Zeilen, die diese Bedingung erfüllen, einen niedrigeren Wert zu als Zeilen, die diese 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;
8
bernie