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.