I SQL, ORDER BY
klausul används vanligtvis för att ordna resultaten av en fråga. Det låter dig välja en eller flera kolumner för att sortera resultaten, och i de flesta fall är det förmodligen allt du behöver.
Men vad händer om du behöver göra ett undantag?
Vad händer om du vill att resultaten ska ordnas i alfabetisk ordning, förutom en rad? Eller flera rader?
Eller så kanske du helt enkelt vill sätta några NULL-värden till slutet, samtidigt som du beställer resultaten som inte är NULL.
Hur som helst, det finns ett snyggt trick du kan använda som gör att du kan göra detta. Och det som är bra är att det är enkelt.
Du kan ta hand om alla ovanstående scenarier genom att lägga till en CASE
uttryck till din ORDER BY
klausul.
Exempel 1 – Flytta "Övrigt" till botten
Anta att vi kör följande fråga mot en tabell som innehåller musikgenrer.
SELECT Genre
FROM MusicGenres
ORDER BY Genre ASC;
Resultat:
+---------+ | Genre | |---------| | Blues | | Country | | Hip Hop | | Jazz | | Metal | | Other | | Pop | | Rap | | Rock | +---------+
I det här fallet sorterar vi resultaten efter Genre
kolumn, i stigande ordning.
Det här är bra förutom en sak. Genren som heter Övrigt . Skulle det inte vara trevligt om vi kunde flytta Annat till botten?
Vi kan uppnå detta med CASE
uttryck. Därför kan vi ta ovanstående fråga och ändra dess ORDER BY
klausul enligt följande.
SELECT Genre
FROM MusicGenres
ORDER BY
CASE Genre
WHEN 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
Resultat:
+---------+ | Genre | |---------| | Blues | | Country | | Hip Hop | | Jazz | | Metal | | Pop | | Rap | | Rock | | Other | +---------+
Exempel 2 – Flytta NULL till botten
Om ditt bord råkar innehålla något av dessa irriterande NULL-värden, kommer du att upptäcka att de kommer att insistera på att stanna i toppen när du beställer i stigande ordning.
Återigen, CASE
uttryck till undsättning!
Låt oss föreställa oss att tabellen ovan innehåller ett par NULL-värden. Och när vi kör vår fråga ser den mer ut så här:
SELECT Genre
FROM MusicGenres
ORDER BY
CASE Genre
WHEN 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
Resultat:
+---------+ | Genre | |---------| | NULL | | NULL | | Blues | | Hip Hop | | Jazz | | Metal | | Pop | | Rock | | Other | +---------+
Så nu vill vi flytta NULL-värdena till botten – ännu lägre än Övrigt .
Vi kan göra det med följande fråga.
SELECT Genre
FROM MusicGenres
ORDER BY
CASE
WHEN Genre IS NULL THEN 2
WHEN Genre = 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
Resultat:
+---------+ | Genre | |---------| | Blues | | Hip Hop | | Jazz | | Metal | | Pop | | Rock | | Other | | NULL | | NULL | +---------+
I det här exemplet använde vi ett annat CASE
formatera. I det här exemplet använde vi ett sökt CASE
uttryck , till skillnad från föregående exempel som använde en enkel CASE
uttryck .
Det sökta CASE
expression utvärderar en uppsättning booleska uttryck för att bestämma resultatet.
Det enkla CASE
expression, å andra sidan, jämför ett uttryck med en uppsättning enkla uttryck för att bestämma resultatet.
Det enkla CASE
uttrycket har ett inmatningsuttryck bredvid CASE
nyckelord, medan det sökta CASE
uttryck gör det inte.
Exempel 3 – Fixa vissa rader till toppen
Föreställ dig nu att vi vill ha en eller flera rader som alltid är överst i resultaten, oavsett var de passar i ordningen för de bredare resultaten.
Till exempel:
SELECT * FROM vAlbums
ORDER BY ArtistName ASC, AlbumName ASC;
Resultat:
+------------------------+--------------------------+---------+ | 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 | +------------------------+--------------------------+---------+
Dessa resultat är sorterade efter ArtistName
, och sedan med AlbumName
.
Men skivbolaget har bestämt att de vill göra en specialkampanj för Tom Jones . Och så vill de ha Tom Jones visas högst upp i resultaten, men sedan ska alla återstående resultat sorteras som de är – alfabetiskt efter artistnamnet och sedan efter albumnamnet.
I det här fallet kan vi göra följande:
SELECT * FROM vAlbums
ORDER BY
CASE ArtistName
WHEN 'Tom Jones' THEN 0
ELSE 1
END,
ArtistName ASC, AlbumName ASC;
Resultat:
+------------------------+--------------------------+---------+ | 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 | +------------------------+--------------------------+---------+