Problem:
Sie möchten eine CASE-Anweisung in SQL verwenden.
Beispiel:
Sie haben Prüfungsergebnisse in der exam
Tisch. Sie müssen jedem Ergebnis einen der folgenden Textwerte zuweisen:'bad result'
, 'average result'
, oder 'good result'
. Schlechte Ergebnisse sind solche unter 40, gute Ergebnisse sind solche über 70 und der Rest sind durchschnittliche Ergebnisse.
Die exam
Tabelle sieht so aus:
name | Ergebnis |
---|---|
Toby Shaw | 56 |
Casey Watson | 49 |
Bennie Lynn | 23 |
Lane Sloan | 70 |
Steff Fuchs | 85 |
Reggie Ward | 40 |
Gail Kennedy | 66 |
Brice Mueller | 90 |
Lösung 1:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category FROM exam;
Die Ergebnistabelle sieht folgendermaßen aus:
name | Ergebnis | Kategorie |
---|---|---|
Toby Shaw | 56 | durchschnittliches Ergebnis |
Casey Watson | 49 | durchschnittliches Ergebnis |
Bennie Lynn | 23 | schlechtes Ergebnis |
Lane Sloan | 70 | durchschnittliches Ergebnis |
Steff Fuchs | 85 | gutes Ergebnis |
Reggie Ward | 40 | durchschnittliches Ergebnis |
Gail Kennedy | 66 | durchschnittliches Ergebnis |
Brice Mueller | 90 | gutes Ergebnis |
Diskussion:
Um einen Wert basierend auf Ihren spezifischen Bedingungen anzuzeigen, müssen Sie einen CASE
schreiben Erklärung. Die Syntax lautet:
CASE WHENTHEN , WHEN THEN , … ELSE END AS
Wenn condition_1
erfüllt ist, dann ist der abgerufene Wert value_1
. Wenn nicht, prüft die Datenbank auf condition_2
. Wenn condition_2
wahr ist, dann ist der abgerufene Wert value_2
. Wenn keine dieser Bedingungen erfüllt ist, prüft SQL nacheinander die verbleibenden Bedingungen, bis eine der Bedingungen erfüllt ist. Wenn keine der Bedingungen erfüllt ist, wird der value_n
nach dem ELSE
angegeben wird abgerufen.
Das ELSE
Teil ist optional. Wenn Sie es weglassen und keine der Bedingungen erfüllt ist, erhalten Sie einen NULL
.
Denken Sie daran, END
zu machen der CASE
Klausel, wenn Sie mit allen Bedingungen fertig sind. Natürlich können Sie sie wie jede von Ihnen erstellte Spalte umbenennen (AS <column_name>
).
In unserem Beispiel 'bad result'
wird zugewiesen, wenn result < 40, and 'good result'
wird zugewiesen, wenn result > 70
. Wenn keine dieser Bedingungen erfüllt ist, ist der Wert 'average result'
. Um die neu erstellte Spalte der Textwerte zu benennen, müssen Sie außerdem einen Alias verwenden (AS
Kategorie). So erhalten Sie:
CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category
Seit 'average result'
wird Ergebnissen zwischen 40
zugewiesen und 70
(einschließlich) können Sie statt ELSE
auch eine Bedingung schreiben (siehe Lösung 2 unten). Es ist jedoch einfacher, ELSE
zu verwenden .
Lösung 2:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' WHEN result >= 40 AND result <= 70 THEN 'average result' END AS category FROM exam;
Die Ergebnistabelle sieht folgendermaßen aus:
name | Ergebnis | Kategorie |
---|---|---|
Toby Shaw | 56 | durchschnittliches Ergebnis |
Casey Watson | 49 | durchschnittliches Ergebnis |
Bennie Lynn | 23 | schlechtes Ergebnis |
Lane Sloan | 70 | durchschnittliches Ergebnis |
Steff Fuchs | 85 | gutes Ergebnis |
Reggie Ward | 40 | durchschnittliches Ergebnis |
Gail Kennedy | 66 | durchschnittliches Ergebnis |
Brice Mueller | 90 | gutes Ergebnis |
Diskussion:
Seit 'average result'
wird Ergebnissen zwischen 40
zugewiesen und 70
(einschließlich) können Sie die folgende Bedingung anstelle eines ELSE
schreiben :
WHEN result >= 40 AND result <= 70 THEN 'average result'
Wenn Sie kein ELSE
verwenden und wollen kein NULL
s in der category
Spalte müssen Sie sicherstellen, dass Sie sich um alle möglichen result
kümmern Werte. Wenn es ein result
gibt das keine der Bedingungen erfüllt, erhalten Sie einen NULL
.
Lösung 3:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category FROM exam;
Die Ergebnistabelle sieht folgendermaßen aus:
name | Ergebnis | Kategorie |
---|---|---|
Toby Shaw | 56 | durchschnittliches Ergebnis |
Casey Watson | 49 | durchschnittliches Ergebnis |
Bennie Lynn | 23 | schlechtes Ergebnis |
Lane Sloan | 70 | durchschnittliches Ergebnis |
Steff Fuchs | 85 | gutes Ergebnis |
Reggie Ward | 40 | durchschnittliches Ergebnis |
Gail Kennedy | 66 | durchschnittliches Ergebnis |
Brice Mueller | 90 | gutes Ergebnis |
Diskussion:
Die angegebenen Bedingungen in CASE
können wie in den vorherigen Lösungen nicht überlappend oder wie in dieser Lösung überlappend sein. Die erste Bedingung ist die gleiche wie zuvor – für result < 40
, die category
ist 'bad result'
. Alle Ergebnisse unter 40
wird an dieser Stelle dieser Wert zugewiesen und Sie brauchen nichts mehr damit zu tun. Das bedeutet, dass Sie nicht sicherstellen müssen, dass result >= 40
ist bei der Angabe der Bedingungen für das 'average result'
– alle Ergebnisse kleiner als 40 haben bereits den Wert 'bad result'
zugewiesen. Schließlich sollte für die verbleibenden Ergebnisse die Kategorie 'good result'
lauten; ein einfaches ELSE 'good result'
kümmert sich darum. So erhalten Sie:
CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category
Hinweis:Die Reihenfolge der Bedingungen in CASE
Angelegenheiten. Wenn Sie die Reihenfolge der ersten beiden Bedingungen umkehren (d. h. wenn Sie WHEN result <= 70 THEN 'average result'
angeben zuerst dann WHEN result <= 70 THEN 'average result'
zweitens), alle Ergebnisse kleiner oder gleich 70
landen im 'average result'
Kategorie, wobei dem 'bad result'
keine Ergebnisse zugewiesen wurden Kategorie.