Mam tabelę SQL z polem daty i godziny. Pole, o którym mowa, może mieć wartość NULL. Mam zapytanie i chcę sortować wyniki rosnąco według pola datetime, jednak chcę wierszy, w których pole datetime ma wartość null na końcu listy, a nie na początku.
Czy istnieje prosty sposób na osiągnięcie tego?
sql
sorting
sql-order-by
David Božjak
źródło
źródło
Odpowiedzi:
źródło
order by case when MyDate is null then 1 else 0 end
to naprawdę długa droga do powiedzeniaORDER BY MyDate IS NULL
order by 0
jest interpretowany jako indeks kolumny, a indeksy kolumn są oparte na 1. Aby posortować zapytanie według trzeciej kolumny, możesz powiedziećorder by 3
(co jest okropnym pomysłem na zapytania produkcyjne), ale bardzo przydatne (jak jest*
) podczas eksperymentowania.(„Trochę” późno, ale w ogóle o tym nie wspomniano)
Nie określiłeś swojego DBMS.
W standardowym SQL (i najnowszym DBMS, takim jak Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB i H2) możesz określić
NULLS LAST
lubNULLS FIRST
:Użyj,
NULLS LAST
aby posortować je do końca:źródło
NULLS FIRST
iNULLS LAST
zostały dodane w SQL: 2003, ale nie ma standardowej implementacji dostępnej w różnych DMBS. W zależności od silnika bazy danych użyjORDER BY expr some_column DESC NULLS LAST
(Oracle),ORDER BY ISNULL(some_column, 1), some_column ASC
(MSSQL) lubORDER BY ISNULL(some_column), some_column ASC
(MySQL z inną implementacją ISNULL ()).ASC
lubDESC
zerami. Tak więc jedynym sposobem, aby to zapewnić, jest użycie,NULL FIRST/LAST
jeśli DBMS to obsługuje. Na to dokumentuje , co zamierza. Użycieisnull()
lub innych funkcji jest obejściem brakującego wsparcia dlaNULLS FIRST/LAST
( obsługiwanego przez Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB i H2)expr
słowa kluczowego przy użyciu NULLS FIRST / LAST. I dzięki, że wartości null były wyświetlane jako pierwsze / ostatnie, w zależności od typu bazy danych, nie wiedziałem o tym!NULLS LAST
nie działałem w mojej bazie danych MySQL.Po prostu natknąłem się na to i wydaje mi się, że następująca metoda działa na mnie w MySQL i PostgreSQL:
jak znaleźć na https://stackoverflow.com/a/7055259/496209
źródło
IS NULL
iIS NOT NULL
nie działało w mojej bazie danych MySQL.źródło
Możesz użyć wbudowanej funkcji, aby sprawdzić zerową lub zerową wartość, jak poniżej. Testuję to i działa dobrze.
select MyDate from MyTable order by ISNULL(MyDate,1) DESC, MyDate ASC;
źródło
ISNULL(MyDate) DESC, MyDate ASC
, ale nie posortowano tego w prawidłowej kolejności.Jeśli Twój silnik na to pozwala
ORDER BY x IS NULL, x
lubORDER BY x NULLS LAST
użyj tego. Ale jeśli to nie pomoże, mogą pomóc:Jeśli sortujesz według typu numerycznego, możesz to zrobić: (Pożyczanie schematu z innej odpowiedzi ).
Każda liczba inna niż null staje się 0, a null staje się 1, co sortuje null na końcu.
Możesz to również zrobić dla ciągów:
Ponieważ
'a'
>''
.Działa to nawet z datami poprzez wymuszenie na zerową wartość int i użycie metody dla wartości int powyżej:
(Pozwala udawać, że schemat ma HireDate).
Metody te pozwalają uniknąć konieczności wymyślania lub zarządzania wartością „maksymalną” każdego typu lub naprawiania zapytań, jeśli typ danych (i maksimum) ulegną zmianie (oba problemy dotyczą innych rozwiązań ISNULL). Plus są znacznie krótsze niż CASE.
źródło
Kiedy kolumna zamówienia jest liczbowa (jak ranga), możesz pomnożyć ją przez -1, a następnie uporządkować malejąco. Zachowa kolejność, której oczekujesz, ale na końcu ustawi NULL.
źródło
Zobacz ten post na blogu .
źródło
Dzięki RedFilter za zapewnienie doskonałego rozwiązania problemu z błędami sortowania zerowalnego pola daty i godziny.
Korzystam z bazy danych SQL Server dla mojego projektu.
Zmiana wartości zerowej datetime na „1” rozwiązuje problem sortowania według kolumny typu danych datetime. Jeśli jednak mamy kolumnę z typem danych innym niż data / godzina, wówczas nie jest w stanie tego obsłużyć.
Aby obsłużyć sortowanie kolumn varchar, próbowałem użyć „ZZZZZZZ”, ponieważ wiedziałem, że kolumna nie ma wartości zaczynających się na „Z”. Działało zgodnie z oczekiwaniami.
W tych samych wierszach użyłem maksymalnych wartości +1 dla int i innych typów danych, aby uzyskać sortowanie zgodnie z oczekiwaniami. To również dało mi wyniki, jakie były wymagane.
Jednak zawsze byłoby idealnie uzyskać coś łatwiejszego w samym silniku bazy danych, który mógłby zrobić coś takiego:
Jak wspomniano w odpowiedzi udzielonej przez a_horse_w_no_name.
źródło
W Oracle można użyć
NULLS FIRST
lubNULLS LAST
: określa, że wartości NULL powinny być zwracane przed / po wartościach innych niż NULL:Na przykład:
Ref: http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html
źródło
Jeśli używasz MariaDB, w dokumentacji NULL Values podają następujące informacje .
Powyżej pokazano dwa sposoby zamawiania według wartości NULL, można je również połączyć ze słowami kluczowymi ASC i DESC. Na przykład innym sposobem uzyskania wartości NULL w pierwszej kolejności byłoby:
źródło
Rozwiązanie wykorzystujące „przypadek” jest uniwersalne, ale nie używaj indeksów.
W moim przypadku potrzebowałem wydajności.
źródło
UNION ALL
.UŻYJ funkcji NVL
Oto alternatywa dla NVL w najbardziej znanym DBMS
źródło
źródło