sql >> Databasteknik >  >> RDS >> Database

Hur man skriver en ORDER BY-klausul med undantag med hjälp av SQL

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


  1. Hur man krypterar en delad databas i Access 2016

  2. Postgres/JSON - uppdatera alla arrayelement

  3. SQLite Skapa tabell

  4. Datamodellen för smarta hem