Bedingte Logik, der CASE-Ausdruck
SQL erlaubt es dir – wie viele Programmiersprachen – bedingte Logik zu schreiben, sodass je nach einer Reihe von Bedingungen einer von mehreren möglichen Werten zurückgegeben wird. In diesem Artikel sehen wir uns an, wie das in SQL mit dem CASE-Ausdruck funktioniert.
Was ist bedingte Logik?
Unter bedingter Logik versteht man, dass ein Programm je nach bestimmten Bedingungen mehrere Ausführungspfade hat.
Beispiel: In der Datenbank „Schedule" gibt es die Tabelle Student mit dem Feld birthday, das das Geburtsdatum eines Studenten enthält. Angenommen, in der Ergebnismenge soll nicht das Geburtsdatum selbst stehen, sondern der Text „Volljährig" oder „Minderjährig" – je nachdem, ob der Student schon 18 ist. Das ist bedingte Logik: Je nach konkreter Bedingung wird entweder der eine oder der andere Wert ausgegeben.
So eine Query mit CASE kann zum Beispiel so aussehen:
MySQL 8.4SELECT first_name, last_name, CASE WHEN TIMESTAMPDIFF(YEAR, birthday, NOW()) >= 18 THEN 'Volljährig' ELSE 'Minderjährig' END AS status FROM Student
MySQL 8.4SELECT first_name, last_name, CASE WHEN EXTRACT(YEAR FROM AGE(NOW(), birthday)) >= 18 THEN 'Volljährig' ELSE 'Minderjährig' END AS status FROM Student
Syntax des suchenden CASE-Ausdrucks
CASE
WHEN bedingung THEN ergebnis
[WHEN ...]
[ELSE standard_ergebnis]
END- [ ]optionaler Teil
- ...kann wiederholt werden
- bedingung
- Ein logischer Ausdruck des WHEN-Zweigs, zum Beispiel price > 100.
- ergebnis
Der Wert, den CASE zurückgibt, wenn die Bedingung des Zweigs wahr ist.
- standard_ergebnis
Der Wert für den Fall, dass keine Bedingung zutrifft. Ohne ELSE kommt NULL zurück.
Optional
Die WHEN-Zweige werden der Reihe nach geprüft: Ist die bedingung des ersten Zweigs wahr, gibt der CASE-Ausdruck sein ergebnis zurück, andernfalls wird der nächste Zweig geprüft und so weiter.
Beispiel
Schauen wir uns CASE am Beispiel der Bestimmung der Schulstufe an.

MySQL 8.4SELECT name, CASE WHEN SUBSTRING(name, 1, INSTR(name, ' ')) IN (10, 11) THEN 'Oberstufe' WHEN SUBSTRING(name, 1, INSTR(name, ' ')) IN (5, 6, 7, 8, 9) THEN 'Mittelstufe' ELSE 'Grundschule' END AS stage FROM Class
MySQL 8.4SELECT name, CASE WHEN SUBSTRING(name, 1, POSITION(' ' IN name) - 1) IN ('10', '11') THEN 'Oberstufe' WHEN SUBSTRING(name, 1, POSITION(' ' IN name) - 1) IN ('5', '6', '7', '8', '9') THEN 'Mittelstufe' ELSE 'Grundschule' END AS stage FROM Class
- Zuerst extrahieren wir die Klassennummer aus dem Namen:
MySQL 8.4
SUBSTRING(name, 1, INSTR(name, ' '))
- Zuerst extrahieren wir die Klassennummer aus dem Namen:
MySQL 8.4
SUBSTRING(name, 1, POSITION(' ' IN name) - 1)
- Dann prüfen wir, ob diese Nummer zur Liste der Oberstufen- bzw. Mittelstufenklassen gehört.
- Liegt die Klassennummer nicht im Bereich 5–11, geben wir „Grundschule" aus.
Syntax des einfachen CASE-Ausdrucks
CASE hat auch eine einfachere Syntax, die dem suchenden CASE ähnelt, aber weniger flexibel ist. Allgemein sieht sie so aus:
CASE wert
WHEN vergleichs_wert THEN ergebnis
[WHEN ...]
[ELSE standard_ergebnis]
END- [ ]optionaler Teil
- ...kann wiederholt werden
- wert
Der Ausdruck, der geprüft wird, zum Beispiel eine Tabellenspalte.
- vergleichs_wert
Ein konkreter Wert des WHEN-Zweigs, zum Beispiel eine Zahl oder ein String.
- ergebnis
Der Wert, den CASE zurückgibt, wenn wert mit dem Wert des Zweigs übereinstimmt.
- standard_ergebnis
Der Wert für den Fall, dass nichts übereinstimmt. Ohne ELSE kommt NULL zurück.
Optional
Bei dieser Syntax wird wert in CASE nacheinander mit den in WHEN angegebenen Werten verglichen. Stimmt einer überein, wird der Wert nach THEN zurückgegeben.
Mit dieser Syntax können wir unser vorheriges Beispiel so umschreiben:
MySQL 8.4SELECT name, CASE SUBSTRING(name, 1, INSTR(name, ' ')) WHEN 11 THEN 'Oberstufe' WHEN 10 THEN 'Oberstufe' WHEN 9 THEN 'Mittelstufe' WHEN 8 THEN 'Mittelstufe' WHEN 7 THEN 'Mittelstufe' WHEN 6 THEN 'Mittelstufe' WHEN 5 THEN 'Mittelstufe' ELSE 'Grundschule' END AS stage FROM Class
MySQL 8.4SELECT name, CASE SUBSTRING(name, 1, POSITION(' ' IN name) - 1) WHEN '11' THEN 'Oberstufe' WHEN '10' THEN 'Oberstufe' WHEN '9' THEN 'Mittelstufe' WHEN '8' THEN 'Mittelstufe' WHEN '7' THEN 'Mittelstufe' WHEN '6' THEN 'Mittelstufe' WHEN '5' THEN 'Mittelstufe' ELSE 'Grundschule' END AS stage FROM Class
Prüf dich selbst
Welchen Wert gibt der CASE-Ausdruck in diesem Fall zurück?
MySQL 8.4CASE 2 WHEN 0 THEN 'Null' WHEN 1 THEN 'Eins' ELSE 'Viele' END