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

So schreiben Sie eine CASE-Anweisung in SQL

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
  WHEN  THEN ,
  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.