En SQL, le ORDER BY
La clause est couramment utilisée pour ordonner les résultats d'une requête. Il vous permet de sélectionner une ou plusieurs colonnes pour ordonner les résultats, et dans la plupart des cas, c'est probablement tout ce dont vous avez besoin.
Mais que se passe-t-il si vous devez faire une exception ?
Que se passe-t-il si vous souhaitez que les résultats soient classés par ordre alphabétique, à l'exception d'une ligne ? Ou plusieurs lignes ?
Ou peut-être voulez-vous simplement mettre toutes les valeurs NULL à la fin, tout en ordonnant les résultats non NULL.
Quoi qu'il en soit, il existe une astuce intéressante que vous pouvez utiliser pour vous permettre de le faire. Et ce qui est bien, c'est que c'est simple.
Vous pouvez répondre à tous les scénarios ci-dessus en ajoutant un CASE
expression à votre ORDER BY
clause.
Exemple 1 - Déplacer "Autre" vers le bas
Supposons que nous lancions la requête suivante sur une table contenant des genres musicaux.
SELECT Genre
FROM MusicGenres
ORDER BY Genre ASC;
Résultat :
+---------+ | Genre | |---------| | Blues | | Country | | Hip Hop | | Jazz | | Metal | | Other | | Pop | | Rap | | Rock | +---------+
Dans ce cas, nous classons les résultats par Genre
colonne, par ordre croissant.
C'est bien sauf pour une chose. Le genre appelé Autre . Ne serait-ce pas bien si nous pouvions déplacer Autre vers le bas ?
Nous pouvons y parvenir avec le CASE
expression. Par conséquent, nous pouvons prendre la requête ci-dessus et modifier son ORDER BY
clause comme suit.
SELECT Genre
FROM MusicGenres
ORDER BY
CASE Genre
WHEN 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
Résultat :
+---------+ | Genre | |---------| | Blues | | Country | | Hip Hop | | Jazz | | Metal | | Pop | | Rap | | Rock | | Other | +---------+
Exemple 2 - Déplacer les valeurs NULL vers le bas
Si votre table contient l'une de ces valeurs NULL embêtantes, vous constaterez qu'elles insisteront pour rester en haut lorsque vous commandez par ordre croissant.
Encore une fois, CASE
expression à la rescousse !
Imaginons que le tableau ci-dessus contient quelques valeurs NULL. Et lorsque nous exécutons notre requête, cela ressemble plus à ceci :
SELECT Genre
FROM MusicGenres
ORDER BY
CASE Genre
WHEN 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
Résultat :
+---------+ | Genre | |---------| | NULL | | NULL | | Blues | | Hip Hop | | Jazz | | Metal | | Pop | | Rock | | Other | +---------+
Alors maintenant, nous voulons déplacer les valeurs NULL vers le bas - même plus bas que Autre .
Nous pouvons le faire avec la requête suivante.
SELECT Genre
FROM MusicGenres
ORDER BY
CASE
WHEN Genre IS NULL THEN 2
WHEN Genre = 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
Résultat :
+---------+ | Genre | |---------| | Blues | | Hip Hop | | Jazz | | Metal | | Pop | | Rock | | Other | | NULL | | NULL | +---------+
Dans cet exemple, nous avons utilisé un CASE
différent format. Dans cet exemple, nous avons utilisé un CASE
recherché expression , contrairement à l'exemple précédent qui utilisait un simple CASE
expression .
Le CASE
recherché expression évalue un ensemble d'expressions booléennes pour déterminer le résultat.
Le simple CASE
expression, d'autre part, compare une expression à un ensemble d'expressions simples pour déterminer le résultat.
Le simple CASE
expression a une expression d'entrée à côté du CASE
mot-clé, tandis que le CASE
recherché l'expression ne le fait pas.
Exemple 3 - Fixer certaines lignes en haut
Imaginons maintenant que nous souhaitions avoir une ou plusieurs lignes toujours en haut des résultats, quelle que soit leur place dans l'ordre des résultats plus larges.
Par exemple :
SELECT * FROM vAlbums
ORDER BY ArtistName ASC, AlbumName ASC;
Résultat :
+------------------------+--------------------------+---------+ | 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 | +------------------------+--------------------------+---------+
Ces résultats sont triés par ArtistName
, puis par AlbumName
.
Mais la maison de disques a décidé de faire une promotion spéciale pour Tom Jones . Et donc ils veulent Tom Jones pour apparaître en haut des résultats, mais tous les résultats restants doivent être classés tels quels - par ordre alphabétique du nom de l'artiste, puis du nom de l'album.
Dans ce cas, nous pouvons procéder comme suit :
SELECT * FROM vAlbums
ORDER BY
CASE ArtistName
WHEN 'Tom Jones' THEN 0
ELSE 1
END,
ArtistName ASC, AlbumName ASC;
Résultat :
+------------------------+--------------------------+---------+ | 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 | +------------------------+--------------------------+---------+