Database
 sql >> Baza danych >  >> RDS >> Database

Jak napisać klauzulę ORDER BY z wyjątkami za pomocą SQL?

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     |
+------------------------+--------------------------+---------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Podział na budżet

  2. Podziel struny we właściwy sposób – lub następny najlepszy sposób

  3. Ustawianie fizycznej gotowości Active Data Guard w architekturze RAC One Node — część 2

  4. Migracja baz danych do Azure SQL Database

  5. Czy Twój sterownik Salesforce obsługuje akcje zbiorcze?