W SQL ORDER BY
Klauzula jest powszechnie używana do porządkowania wyników zapytania. Pozwala wybrać jedną lub więcej kolumn, aby uporządkować wyniki, a w większości przypadków to prawdopodobnie wszystko, czego potrzebujesz.
Ale co, jeśli musisz zrobić wyjątek?
Co zrobić, jeśli chcesz, aby wyniki były uporządkowane alfabetycznie, z wyjątkiem jednego wiersza? A może kilka rzędów?
A może po prostu chcesz umieścić dowolne wartości NULL na końcu podczas porządkowania wyników innych niż NULL.
Tak czy inaczej, istnieje fajna sztuczka, której możesz użyć, która pozwoli ci to zrobić. A dobre jest to, że to proste.
Możesz zaspokoić wszystkie powyższe scenariusze, dodając CASE
wyrażenie do Twojego ORDER BY
klauzula.
Przykład 1 – Przesuń „Inne” na dół
Załóżmy, że uruchamiamy następujące zapytanie w tabeli zawierającej gatunki muzyczne.
SELECT Genre
FROM MusicGenres
ORDER BY Genre ASC;
Wynik:
+---------+ | Genre | |---------| | Blues | | Country | | Hip Hop | | Jazz | | Metal | | Other | | Pop | | Rap | | Rock | +---------+
W tym przypadku wyniki sortujemy według Genre
kolumna w porządku rosnącym.
To jest w porządku, z wyjątkiem jednej rzeczy. Gatunek o nazwie Inne . Czy nie byłoby miło, gdybyśmy mogli przenieść Inne na sam dół?
Możemy to osiągnąć za pomocą CASE
wyrażenie. Dlatego możemy wziąć powyższe zapytanie i zmodyfikować jego ORDER BY
klauzula w następujący sposób.
SELECT Genre
FROM MusicGenres
ORDER BY
CASE Genre
WHEN 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
Wynik:
+---------+ | Genre | |---------| | Blues | | Country | | Hip Hop | | Jazz | | Metal | | Pop | | Rap | | Rock | | Other | +---------+
Przykład 2 – Przenieś wartości NULL na dół
Jeśli zdarzy się, że Twoja tabela zawiera któreś z tych nieznośnych wartości NULL, przekonasz się, że będą nalegać na pozostanie na szczycie, gdy zamawiasz w porządku rosnącym.
Jeszcze raz CASE
wyrażenie na ratunek!
Wyobraźmy sobie, że powyższa tabela zawiera kilka wartości NULL. A kiedy uruchamiamy nasze zapytanie, wygląda to mniej więcej tak:
SELECT Genre
FROM MusicGenres
ORDER BY
CASE Genre
WHEN 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
Wynik:
+---------+ | Genre | |---------| | NULL | | NULL | | Blues | | Hip Hop | | Jazz | | Metal | | Pop | | Rock | | Other | +---------+
Więc teraz chcemy przenieść wartości NULL na dół – nawet niżej niż Inne .
Możemy to zrobić za pomocą następującego zapytania.
SELECT Genre
FROM MusicGenres
ORDER BY
CASE
WHEN Genre IS NULL THEN 2
WHEN Genre = 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
Wynik:
+---------+ | Genre | |---------| | Blues | | Hip Hop | | Jazz | | Metal | | Pop | | Rock | | Other | | NULL | | NULL | +---------+
W tym przykładzie użyliśmy innego CASE
format. W tym przykładzie użyliśmy przeszukanego CASE
wyrażenie , w przeciwieństwie do poprzedniego przykładu, w którym użyto prostego CASE
wyrażenie .
Wyszukiwany CASE
wyrażenie oblicza zestaw wyrażeń logicznych w celu określenia wyniku.
Prosty CASE
Z drugiej strony wyrażenie porównuje wyrażenie z zestawem prostych wyrażeń w celu określenia wyniku.
Prosty CASE
wyrażenie ma wyrażenie wejściowe obok CASE
słowo kluczowe, podczas gdy wyszukiwany CASE
wyrażenie nie.
Przykład 3 – napraw niektóre wiersze u góry
Teraz wyobraź sobie, że chcemy mieć jeden lub więcej wierszy, które zawsze znajdują się na górze wyników, niezależnie od tego, gdzie mieszczą się w kolejności szerszych wyników.
Na przykład:
SELECT * FROM vAlbums
ORDER BY ArtistName ASC, AlbumName ASC;
Wynik:
+------------------------+--------------------------+---------+ | ArtistName | AlbumName | Genre | |------------------------+--------------------------+---------| | AC/DC | Powerage | Rock | | Allan Holdsworth | All Night Wrong | Jazz | | Allan Holdsworth | The Sixteen Men of Tain | Jazz | | Buddy Rich | Big Swing Face | Jazz | | Devin Townsend | Casualties of Cool | Rock | | Devin Townsend | Epicloud | Rock | | Devin Townsend | Ziltoid the Omniscient | Rock | | Iron Maiden | Killers | Rock | | Iron Maiden | No Prayer for the Dying | Rock | | Iron Maiden | Piece of Mind | Rock | | Iron Maiden | Powerslave | Rock | | Iron Maiden | Somewhere in Time | Rock | | Jim Reeves | Singing Down the Lane | Country | | Michael Learns to Rock | Blue Night | Pop | | Michael Learns to Rock | Eternity | Pop | | Michael Learns to Rock | Scandinavia | Pop | | The Script | No Sound Without Silence | Pop | | Tom Jones | Along Came Jones | Pop | | Tom Jones | Long Lost Suitcase | Pop | | Tom Jones | Praise and Blame | Pop | +------------------------+--------------------------+---------+
Te wyniki są uporządkowane według ArtistName
, a następnie przez AlbumName
.
Ale wytwórnia płytowa zdecydowała, że chce zrobić specjalną promocję dla Toma Jonesa . Dlatego chcą Toma Jonesa aby pojawiły się u góry wyników, ale wszystkie pozostałe wyniki należy uporządkować bez zmian – alfabetycznie według nazwy wykonawcy, a następnie według nazwy albumu.
W takim przypadku możemy wykonać następujące czynności:
SELECT * FROM vAlbums
ORDER BY
CASE ArtistName
WHEN 'Tom Jones' THEN 0
ELSE 1
END,
ArtistName ASC, AlbumName ASC;
Wynik:
+------------------------+--------------------------+---------+ | ArtistName | AlbumName | Genre | |------------------------+--------------------------+---------| | Tom Jones | Along Came Jones | Pop | | Tom Jones | Long Lost Suitcase | Pop | | Tom Jones | Praise and Blame | Pop | | AC/DC | Powerage | Rock | | Allan Holdsworth | All Night Wrong | Jazz | | Allan Holdsworth | The Sixteen Men of Tain | Jazz | | Buddy Rich | Big Swing Face | Jazz | | Devin Townsend | Casualties of Cool | Rock | | Devin Townsend | Epicloud | Rock | | Devin Townsend | Ziltoid the Omniscient | Rock | | Iron Maiden | Killers | Rock | | Iron Maiden | No Prayer for the Dying | Rock | | Iron Maiden | Piece of Mind | Rock | | Iron Maiden | Powerslave | Rock | | Iron Maiden | Somewhere in Time | Rock | | Jim Reeves | Singing Down the Lane | Country | | Michael Learns to Rock | Blue Night | Pop | | Michael Learns to Rock | Eternity | Pop | | Michael Learns to Rock | Scandinavia | Pop | | The Script | No Sound Without Silence | Pop | +------------------------+--------------------------+---------+