Dlaczego jest tak, że gdy mamy wartość NULL w kolumnie i sortujemy według wartości rosnąco, wartości NULL są najpierw sortowane?
select 1 as test
union all
select 2
union all
select NULL
union all
select 3
union all
select 4
order by test
prowadzi do
NULL
1
2
3
4
Ciągle myślę, że NULL oznacza „Nieokreślony” lub możliwy „Nieznany”. Jeśli to prawda, czy nie posortują na końcu, ponieważ wartość może być większa niż wszystkie inne wartości? (Czy jest to gdzieś opcja sortowania?)
Korzystam z SQL Server 2008R2, ale podejrzewam, że dotyczy to wszystkich serwerów SQL i prawdopodobnie wszystkich RDBMS.
sql-server
database-theory
sorting
Richard
źródło
źródło
desc
kolejności, aby pokazać największe lub najnowsze rzeczy, w takim przypadku byłbym zadowolony, gdyby rzeczy zerowe były ostatnie.Odpowiedzi:
NULL oznacza nieznany. Żadna inna interpretacja nie jest ważna.
Nie może być . Nie ma żadnej potencjalnej wartości. Nieznany jest nieznany jest nieznany.
Jeśli chodzi o to, dlaczego pojawia się jako pierwsza, a nie ostatnia, nie jest to uwzględnione w opublikowanych standardach SQL i niestety jest pozostawione do uznania dostawcy RDBMS:
źródło
Masz rację, co
NULL
może oznaczać „Nieokreślony” lub „Nieznany” lub „Jeszcze nie wiadomo” lub „Nie składać wniosku”. Ale nie ma powodu, aby stawiać Nulls na pierwszym miejscu lub na końcu. Jeśli nie znamy rzeczywistych wartości, to może być mały lub duży.Myślę, że standardem określającym pożądane zachowanie wartości Null podczas sortowania jest:
Niestety SQL Server nie przyjął jeszcze tej składni. Jeśli się nie mylę, PostgreSQL i Oracle mają to.
Jedno rozwiązanie:
Kolejne rozwiązanie, które wymaga korekty w zależności od typu danych - ale nie będzie dobrze działać, ponieważ nie można użyć indeksu na
(test)
:źródło
Nie wiem, dlaczego tak się dzieje, ale z definicji NULLS nie może być porównywany z nie-NULLS, więc albo muszą iść na początku, albo na końcu (odpowiedź Marka opisuje to bardziej szczegółowo).
Aby uzyskać pożądane zachowanie - O ile mi wiadomo, nie ma opcji sortowania, aby pozostawić wartości zerowe na końcu, więc musisz je wyeliminować za pomocą kolumny obliczeniowej, aby wymusić je na końcu. Jednak w SQL Server nie można sortować według kolumny obliczeniowej (
CASE WHEN ...
), gdy dane zawierają operator ustawiania (UNION ALL
). Więc:Działa do sortowania wartości zerowych na końcu. Jeśli musisz użyć
UNION
(lubEXCEPT
lubINTERSECTS
) do wygenerowania zestawu danych, zrzuć dane do tymczasowej tabeli, jak wyżej.źródło
Jeśli masz do czynienia z liczbami, możesz także użyć
NULL
są najniższymi możliwymi wartościami, dlategoDESC
umieszcza je na końcu. W międzyczasie wartości niepuste mają odwrócony znak, więc wDESC
rzeczywistości jest toASC
wartość rzeczywista. Powinno to być szybsze niżCASE
i przypuszczam, że optymalizator zapytań może również używać indeksów wtest
kolumnie.źródło
(- test)
.