Warum werden die NULL-Werte zuerst sortiert, wenn wir einen NULL-Wert in einer Spalte haben und nach aufsteigendem Wert sortieren?
select 1 as test
union all
select 2
union all
select NULL
union all
select 3
union all
select 4
order by test
Ergebnisse in
NULL
1
2
3
4
Ich denke immer wieder, dass NULL "Unbestimmt" oder "Unbekannt" bedeutet. Wenn das wahr ist, würden sie dann nicht zuletzt sortieren, da der Wert größer sein könnte als alle anderen Werte? (Oder ist das irgendwo eine Sortieroption?)
Ich arbeite mit SQL Server 2008R2, aber ich vermute, dass dies für alle SQL Server und wahrscheinlich für alle RDBMS gilt.
sql-server
database-theory
sorting
Richard
quelle
quelle
desc
Bestellung verwenden möchten, um die größten oder neuesten Dinge zu zeigen. In diesem Fall wäre ich froh, wenn null Dinge die letzten wären.Antworten:
NULL bedeutet unbekannt. Keine andere Interpretation ist gültig.
Es gibt kein könnte sein . Es gibt keinen potenziellen Wert. Unbekannt ist unbekannt ist unbekannt.
Was den Grund angeht, warum es als erstes und nicht als letztes angezeigt wird, wird dies von veröffentlichten SQL-Standards nicht berücksichtigt und liegt leider im Ermessen des RDBMS-Anbieters:
quelle
Sie haben
NULL
Recht, dass dies "Unbestimmt" oder "Unbekannt" oder "Noch nicht bekannt" oder "Nicht zutreffend" bedeuten kann. Es gibt jedoch keinen Grund, die Nullen an die erste oder letzte Stelle zu setzen. Wenn wir die tatsächlichen Werte nicht kennen, können sie klein oder groß sein.Ich denke, der Standard für die Bestimmung des gewünschten Verhaltens von Nullen während des Sortierens ist:
Leider hat SQL-Server diese Syntax noch nicht übernommen. Wenn ich mich nicht irre haben PostgreSQL und Oracle es.
Eine Lösung:
Eine andere Lösung, die abhängig vom Datentyp angepasst werden muss, aber keine gute Leistung bringt, da kein Index für Folgendes verwendet werden kann
(test)
:quelle
Ich weiß nicht, warum es so gemacht wird, aber per Definition kann NULLS nicht mit Nicht-NULLS verglichen werden, daher müssen sie entweder am Anfang oder am Ende stehen (Marks Antwort behandelt dies ausführlicher).
So erhalten Sie das gewünschte Verhalten - Soweit ich weiß, gibt es keine Sortieroption, um Nullen als letzte zu setzen. Sie müssen es also umgehen, indem Sie eine berechnete Spalte verwenden, um sie als letzte zu erzwingen. In SQL Server können Sie jedoch nicht nach einer berechneten Spalte (
CASE WHEN ...
) sortieren, wenn Ihre Daten einen festgelegten Operator (UNION ALL
) enthalten. So:Funktioniert zum Sortieren von Nullen als letztes. Wenn Sie Ihren Datensatz mit
UNION
(oderEXCEPT
oderINTERSECTS
) generieren müssen, geben Sie Ihre Daten wie oben beschrieben in eine temporäre Tabelle aus.quelle
Wenn Sie mit Zahlen zu tun haben, können Sie auch verwenden
NULL
sind die niedrigstmöglichen Werte,DESC
setzen sie daher am Ende. Inzwischen haben die keine Nullwerte das Vorzeichen umgekehrt , soDESC
tatsächlich eine istASC
auf den realen Werten. Dies sollte schneller sein alsCASE
und ich nehme an, dass das Abfrageoptimierungsprogramm auchtest
Spaltenindizes verwenden kann.quelle
(- test)
.