Database
 sql >> Datenbank >  >> RDS >> Database

So schreiben Sie eine ORDER BY-Klausel mit Ausnahmen mit SQL

In SQL der ORDER BY -Klausel wird häufig verwendet, um die Ergebnisse einer Abfrage zu ordnen. Sie können eine oder mehrere Spalten auswählen, um die Ergebnisse zu ordnen, und in den meisten Fällen ist dies wahrscheinlich alles, was Sie brauchen.

Aber was ist, wenn Sie eine Ausnahme machen müssen?

Was ist, wenn Sie möchten, dass die Ergebnisse bis auf eine Zeile alphabetisch geordnet werden? Oder mehrere Zeilen?

Oder vielleicht möchten Sie einfach alle NULL-Werte an das Ende stellen, während Sie die Nicht-NULL-Ergebnisse sortieren.

In jedem Fall gibt es einen netten Trick, mit dem Sie dies tun können. Und das Gute daran ist, dass es ganz einfach ist.

Sie können für alle oben genannten Szenarien sorgen, indem Sie einen CASE hinzufügen Ausdruck zu Ihrem ORDER BY Klausel.

Beispiel 1 – „Andere“ nach unten verschieben

Angenommen, wir führen die folgende Abfrage für eine Tabelle aus, die Musikgenres enthält.

SELECT Genre 
FROM MusicGenres
ORDER BY Genre ASC;

Ergebnis:

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

In diesem Fall ordnen wir die Ergebnisse nach Genre Spalte, in aufsteigender Reihenfolge.

Das ist in Ordnung, bis auf eine Sache. Das Genre namens Andere . Wäre es nicht schön, wenn wir Other verschieben könnten nach unten?

Dies erreichen wir mit dem CASE Ausdruck. Daher können wir die obige Abfrage nehmen und ihren ORDER BY ändern Klausel wie folgt.

SELECT Genre
FROM MusicGenres
ORDER BY 
    CASE Genre
        WHEN 'Other' THEN 1
        ELSE 0
    END
    ASC, Genre ASC;

Ergebnis:

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

Beispiel 2 – NULLen nach unten verschieben

Wenn Ihre Tabelle zufällig einen dieser lästigen NULL-Werte enthält, werden Sie feststellen, dass sie darauf bestehen, an der Spitze zu bleiben, wenn Sie in aufsteigender Reihenfolge sortieren.

Noch einmal, CASE Ausdruck zur Rettung!

Stellen wir uns vor, dass die obige Tabelle ein paar NULL-Werte enthält. Und wenn wir unsere Abfrage ausführen, sieht sie eher so aus:

SELECT Genre
FROM MusicGenres
ORDER BY 
    CASE Genre
        WHEN 'Other' THEN 1
        ELSE 0
    END
    ASC, Genre ASC;

Ergebnis:

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

Also wollen wir jetzt die NULL-Werte nach unten verschieben – sogar noch niedriger als Andere .

Das können wir mit der folgenden Abfrage tun.

SELECT Genre
FROM MusicGenres
ORDER BY 
    CASE
        WHEN Genre IS NULL THEN 2
        WHEN Genre = 'Other' THEN 1
        ELSE 0
    END
    ASC, Genre ASC;

Ergebnis:

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

In diesem Beispiel haben wir einen anderen CASE verwendet Format. In diesem Beispiel haben wir einen durchsuchten CASE verwendet Ausdruck , im Gegensatz zum vorherigen Beispiel, das einen einfachen CASE verwendete Ausdruck .

Der gesuchte CASE expression wertet eine Reihe von booleschen Ausdrücken aus, um das Ergebnis zu bestimmen.

Der einfache CASE expression hingegen vergleicht einen Ausdruck mit einer Menge einfacher Ausdrücke, um das Ergebnis zu bestimmen.

Der einfache CASE Ausdruck hat einen Eingabeausdruck neben CASE Schlüsselwort, wohingegen der gesuchte CASE Ausdruck nicht.

Beispiel 3 – Bestimmte Zeilen oben fixieren

Stellen Sie sich nun vor, wir möchten eine oder mehrere Zeilen haben, die immer oben in den Ergebnissen stehen, unabhängig davon, wo sie in die Reihenfolge der breiteren Ergebnisse passen.

Zum Beispiel:

SELECT * FROM vAlbums
ORDER BY ArtistName ASC, AlbumName ASC;

Ergebnis:

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

Diese Ergebnisse sind nach ArtistName geordnet , und dann nach AlbumName .

Aber die Plattenfirma hat entschieden, dass sie eine Sonderpromotion für Tom Jones machen wollen . Und deshalb wollen sie Tom Jones oben in den Ergebnissen erscheinen, aber alle übrigen Ergebnisse werden unverändert geordnet – alphabetisch nach dem Künstlernamen, dann nach dem Albumnamen.

In diesem Fall können wir Folgendes tun:

SELECT * FROM vAlbums
ORDER BY 
    CASE ArtistName
        WHEN 'Tom Jones' THEN 0
        ELSE 1
    END,
    ArtistName ASC, AlbumName ASC;

Ergebnis:

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