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