sql >> Database teknologi >  >> RDS >> Database

Sådan skriver du en ORDER BY-klausul med undtagelser ved hjælp af SQL

I SQL er ORDER BY klausul bruges almindeligvis til at sortere resultaterne af en forespørgsel. Det giver dig mulighed for at vælge en eller flere kolonner for at sortere resultaterne, og i de fleste tilfælde er det sandsynligvis alt, du behøver.

Men hvad hvis du har brug for at gøre en undtagelse?

Hvad hvis du vil have resultaterne ordnet alfabetisk, bortset fra én række? Eller flere rækker?

Eller måske vil du blot sætte eventuelle NULL-værdier til sidst, mens du bestiller resultaterne, der ikke er NULL.

Uanset hvad, er der et pænt trick, du kan bruge, som gør det muligt for dig at gøre dette. Og det gode er, at det er enkelt.

Du kan tage højde for alle ovenstående scenarier ved at tilføje en CASE udtryk til din ORDER BY klausul.

Eksempel 1 – Flyt "Andet" til bunden

Antag, at vi kører følgende forespørgsel mod en tabel, der indeholder musikgenrer.

SELECT Genre 
FROM MusicGenres
ORDER BY Genre ASC;

Resultat:

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

I dette tilfælde sorterer vi resultaterne efter Genre kolonne i stigende rækkefølge.

Det er fint bortset fra én ting. Genren kaldet Andet . Ville det ikke være rart, hvis vi kunne flytte Andet til bunden?

Vi kan opnå dette med CASE udtryk. Derfor kan vi tage ovenstående forespørgsel og ændre dens ORDER BY klausul som følger.

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

Eksempel 2 – Flyt NULL til bunden

Hvis din tabel tilfældigvis indeholder nogle af disse irriterende NULL-værdier, vil du opdage, at de vil insistere på at forblive øverst, når du bestiller i stigende rækkefølge.

Endnu en gang CASE udtryk til undsætning!

Lad os forestille os, at ovenstående tabel indeholder et par NULL-værdier. Og når vi kører vores forespørgsel, ser det mere sådan ud:

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 vil vi flytte NULL-værdierne til bunden – endnu lavere end Andet .

Det kan vi gøre med følgende forespørgsel.

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 dette eksempel brugte vi en anden CASE format. I dette eksempel brugte vi en søgt CASE udtryk , i modsætning til det foregående eksempel, der brugte en simpel CASE udtryk .

Den søgte CASE udtryk evaluerer et sæt boolske udtryk for at bestemme resultatet.

Den simple CASE udtryk på den anden side sammenligner et udtryk med et sæt simple udtryk for at bestemme resultatet.

Den simple CASE udtryk har et inputudtryk ved siden af ​​CASE søgeord, hvorimod den søgte CASE udtryk gør det ikke.

Eksempel 3 – Ret visse rækker til toppen

Forestil dig nu, at vi vil have en eller flere rækker, der altid er øverst i resultaterne, uanset hvor de passer inden for rækkefølgen af ​​de bredere resultater.

For eksempel:

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

Disse resultater er sorteret efter ArtistName , og derefter ved AlbumName .

Men pladeselskabet har besluttet, at de vil lave en særlig kampagne for Tom Jones . Og så vil de have Tom Jones vises øverst i resultaterne, men derefter skal alle de resterende resultater sorteres som de er – alfabetisk efter kunstnernavnet og derefter efter albumnavnet.

I dette tilfælde kan vi gøre følgende:

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


  1. Sådan viser du Unicode-data med PHP

  2. Trævisningskontrol Afkrydsningsmærke Tilføj Slet noder

  3. python pip installeringsfejl psycopg2

  4. Opbygning af en maskinlæringsmodel med SQL Server, ML.NET og C#