Sortieren Sie NULL-Werte bis zum Ende einer Tabelle

90

Gibt es eine Möglichkeit mit PostgreSQL, Zeilen mit zu sortieren? NULL Werten in Feldern bis zum Ende der ausgewählten Tabelle ?

Mögen:

SELECT * FROM table ORDER BY somevalue, PUT_NULL_TO_END
helle
quelle

Antworten:

163

Zunächst einmal NULL - Werte sind zuletzt in Standard sortiert aufsteigend sortiert. Sie müssen nichts extra tun.

Das Problem betrifft die absteigende Reihenfolge, die die perfekte Umkehrung darstellt und daher zuerst NULL-Werte sortiert. Die Lösung, auf die @Mosty hingewiesen hat, wurde mit PostgreSQL 8.3 eingeführt :

ORDER BY somevalue DESC NULLS LAST

Für PostgreSQL 8.2 und älter oder andere RDBMS ohne diese Standard-SQL-Funktion können Sie Folgendes ersetzen:

ORDER BY (somevalue IS NULL), somevalue DESC

FALSEsortiert vorher TRUE, so dass NULL-Werte zuletzt kommen, genau wie im obigen Beispiel.

Verwandte spätere Antwort:

Erwin Brandstetter
quelle
1
IMHO in den meisten realen Anwendungen möchten Sie, dass Nullwerte unabhängig von der Reihenfolge gültig sind. Zum Beispiel das Sortieren von DESC nach einem optionalen Zeitstempel, Vornamen, Nachnamen usw. Ich finde es also wirklich verdächtig, obwohl es sinnvoll erscheint, dass die mathematische DESC-Reihenfolge das Gegenteil von ASC ist. Vielleicht sollen die Nullen nur in einer eigenen Kategorie sein und sollten nicht von ASC, DESC beeinflusst werden und immer zuletzt gesetzt werden, das wäre eine bessere Standardeinstellung gewesen.
Christophe Roussy
Es könnte sich auf die Indizes auswirken, wenn es sich um DESC handelt. Vielleicht könnten Sie auch einen Hinweis dazu hinzufügen? postgresql.org/message-id/…
Christophe Roussy
@ChristopheRoussy: Indizes, die der Sortierreihenfolge entsprechen, werden in der oben verlinkten Antwort berührt.
Erwin Brandstetter
2
Persönlich denke ich, dass die Standardeinstellung das Gegenteil sein sollte: NULL-Werte stehen zuerst in aufsteigender Reihenfolge und zuletzt in absteigender Reihenfolge. Das ist viel intuitiver, da NULL der "kleinste" Wert ist.
Stephen
1
Für Leute, die von MYSQL kommen, ist dies ein lol? Warum wurde es überhaupt so gebaut? ODER hat MySQL das Ergebnis optimiert
CodeGuru