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