sql >> Database >  >> RDS >> Database

Een ORDER BY-clausule schrijven met uitzonderingen met SQL

In SQL is de ORDER BY clausule wordt vaak gebruikt om de resultaten van een query te ordenen. Hiermee kunt u een of meer kolommen selecteren om de resultaten te ordenen, en in de meeste gevallen is dit waarschijnlijk alles wat u nodig heeft.

Maar wat als u een uitzondering moet maken?

Wat als u wilt dat de resultaten alfabetisch worden gerangschikt, behalve één rij? Of meerdere rijen?

Of misschien wil je gewoon alle NULL-waarden aan het einde zetten, terwijl je de niet-NULL-resultaten bestelt.

Hoe dan ook, er is een handige truc die je kunt gebruiken om dit te doen. En het mooie is, het is eenvoudig.

U kunt voor alle bovenstaande scenario's zorgen door een CASE . toe te voegen uitdrukking toe aan uw ORDER BY clausule.

Voorbeeld 1 – Verplaats “Overige” naar beneden

Stel dat we de volgende query uitvoeren op een tabel met muziekgenres.

SELECT Genre 
FROM MusicGenres
ORDER BY Genre ASC;

Resultaat:

+---------+
| Genre   |
|---------|
| Blues   |
| Country |
| Hip Hop |
| Jazz    |
| Metal   |
| Other   |
| Pop     |
| Rap     |
| Rock    |
+---------+

In dit geval rangschikken we de resultaten op Genre kolom, in oplopende volgorde.

Dit is prima, op één ding na. Het genre genaamd Overig . Zou het niet mooi zijn als we Overig . konden verplaatsen naar beneden?

We kunnen dit bereiken met de CASE uitdrukking. Daarom kunnen we de bovenstaande query nemen en de ORDER BY . ervan wijzigen clausule als volgt.

SELECT Genre
FROM MusicGenres
ORDER BY 
    CASE Genre
        WHEN 'Other' THEN 1
        ELSE 0
    END
    ASC, Genre ASC;

Resultaat:

+---------+
| Genre   |
|---------|
| Blues   |
| Country |
| Hip Hop |
| Jazz    |
| Metal   |
| Pop     |
| Rap     |
| Rock    |
| Other   |
+---------+

Voorbeeld 2 – NULL's naar beneden verplaatsen

Als je tabel een van deze vervelende NULL-waarden bevat, zul je merken dat ze erop staan ​​bovenaan te blijven wanneer je in oplopende volgorde bestelt.

Nogmaals, CASE uitdrukking te hulp!

Laten we ons voorstellen dat de bovenstaande tabel een paar NULL-waarden bevat. En wanneer we onze query uitvoeren, ziet het er meer als volgt uit:

SELECT Genre
FROM MusicGenres
ORDER BY 
    CASE Genre
        WHEN 'Other' THEN 1
        ELSE 0
    END
    ASC, Genre ASC;

Resultaat:

+---------+
| Genre   |
|---------|
| NULL    |
| NULL    |
| Blues   |
| Hip Hop |
| Jazz    |
| Metal   |
| Pop     |
| Rock    |
| Other   |
+---------+

Dus nu willen we de NULL-waarden naar beneden verplaatsen - zelfs lager dan Overig .

We kunnen dat doen met de volgende vraag.

SELECT Genre
FROM MusicGenres
ORDER BY 
    CASE
        WHEN Genre IS NULL THEN 2
        WHEN Genre = 'Other' THEN 1
        ELSE 0
    END
    ASC, Genre ASC;

Resultaat:

+---------+
| Genre   |
|---------|
| Blues   |
| Hip Hop |
| Jazz    |
| Metal   |
| Pop     |
| Rock    |
| Other   |
| NULL    |
| NULL    |
+---------+

In dit voorbeeld hebben we een andere CASE . gebruikt formaat. In dit voorbeeld gebruikten we een gezocht CASE uitdrukking , in tegenstelling tot het vorige voorbeeld dat een eenvoudige CASE . gebruikte uitdrukking .

De gezochte CASE expression evalueert een set Booleaanse expressies om het resultaat te bepalen.

De eenvoudige CASE expression daarentegen vergelijkt een uitdrukking met een reeks eenvoudige uitdrukkingen om het resultaat te bepalen.

De eenvoudige CASE uitdrukking heeft een invoeruitdrukking naast de CASE trefwoord, terwijl de gezochte CASE uitdrukking niet.

Voorbeeld 3 – Bepaalde rijen bovenaan zetten

Stel je nu voor dat we een of meer rijen willen hebben die altijd bovenaan de resultaten staan, ongeacht waar ze passen in de volgorde van de bredere resultaten.

Bijvoorbeeld:

SELECT * FROM vAlbums
ORDER BY ArtistName ASC, AlbumName ASC;

Resultaat:

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

Deze resultaten zijn gerangschikt op ArtistName , en dan door AlbumName .

Maar de platenmaatschappij heeft besloten dat ze een speciale promotie willen doen voor Tom Jones . En dus willen ze Tom Jones om bovenaan de resultaten te verschijnen, maar dan moeten alle resterende resultaten worden gerangschikt zoals ze zijn - alfabetisch op de naam van de artiest en vervolgens op de naam van het album.

In dit geval kunnen we het volgende doen:

SELECT * FROM vAlbums
ORDER BY 
    CASE ArtistName
        WHEN 'Tom Jones' THEN 0
        ELSE 1
    END,
    ArtistName ASC, AlbumName ASC;

Resultaat:

+------------------------+--------------------------+---------+
| 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. Hoe rangschikkingsposities aan rijen toe te voegen met DENSE_RANK() in SQL

  2. Wijzig de standaard datum-tijdnotatie op een enkele database in SQL Server

  3. Bindende parameters voor Oracle Dynamic SQL

  4. Transponeer een set rijen als kolommen in SQL Server 2000