Database
 sql >> Base de données >  >> RDS >> Database

Comment écrire une clause ORDER BY avec des exceptions en utilisant SQL

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