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_updated
kommen , bevor nicht-null last_updated
.
Ist das möglich?
order by last_updated asc -- and null last_updated records first ??
Antworten:
Postgres stellt die
NULLS FIRST | LAST
Schlüsselwörter für dieORDER BY
Klausel bereit , um genau diesem Bedarf gerecht zu werden: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: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.
quelle
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;
quelle
ASC
die Standardsortierreihenfolge ist, sodass Sie sie nicht unbedingt eingeben müssen.NULLS FIRST
ist auch die ANSI-kompatible Methode, um zuerst Nullen zu schreiben.seenAt is null
Ich sortiere Benachrichtigungen - zuerst nicht gesehen (dann ), aber wenn gesehen, dann sortiere ich nachcreatedAt
instaed)NULLS FIRST
wird immer noch nach dem tatsächlichen Wert sortiert, wenn der Wert nicht null war. Das hat den Trick für mich getan. Vielen Dank!