Wenn du schon mal mit CASE gearbeitet hast, kennst du die Möglichkeit, Logik direkt in die Query einzubauen. Aber nicht jeder weiß, dass CASE zwei Formen hat. CASE WHEN ... ist wie ein if-else-Check, aber die einfache CASE-Variante ist wie switch-case aus anderen Sprachen: sie vergleicht einen Ausdruck mit mehreren Werten und führt dann den passenden Block aus.
Das sieht kompakter und intuitiver aus, wenn du ein Feld mit festen Werten vergleichst.
Syntax der einfachen CASE
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
Ganz easy:
expression— das ist der Ausdruck oder das Feld, das mit den Wertenvalue1,value2usw. verglichen wird.THENgibt an, was zurückgegeben wird, wenn es passt.ELSE— was zurückkommt, wenn nix passt (kann man weglassen, aber besser nicht).
Beispiel: Noten der Studenten
Stell dir eine Tabelle students mit einer Spalte grade vor, die eine ganze Zahl von 2 bis 5 enthält. Wir wollen die Noten als Text anzeigen.
SELECT
name,
grade,
CASE grade
WHEN 5 THEN 'Ausgezeichnet'
WHEN 4 THEN 'Gut'
WHEN 3 THEN 'Befriedigend'
WHEN 2 THEN 'Ungenügend'
ELSE 'Unbekannt'
END AS note_in_worten
FROM students;
Hier vergleicht CASE den Wert des Feldes grade mit den festen Werten 2, 3, 4, 5.
Beispiel: Produktkategorien nach Code
In der Tabelle products gibt es das Feld category_code, wo kurze Labels wie 'el', 'frn', 'bks' usw. drinstehen. Wir wollen den lesbaren Namen der Kategorie anzeigen.
SELECT
product_name,
category_code,
CASE category_code
WHEN 'el' THEN 'Elektronik'
WHEN 'frn' THEN 'Möbel'
WHEN 'bks' THEN 'Bücher'
ELSE 'Sonstiges'
END AS category_name
FROM products;
Das ist besonders praktisch, wenn du "menschlichen" Text statt Code anzeigen willst.
Beispiel: Monatsnamen
Manchmal willst du Monatsnamen als Text nach Nummer anzeigen:
SELECT
EXTRACT(MONTH FROM order_date) AS month_number,
CASE EXTRACT(MONTH FROM order_date)
WHEN 1 THEN 'Januar'
WHEN 2 THEN 'Februar'
WHEN 3 THEN 'März'
WHEN 4 THEN 'April'
WHEN 5 THEN 'Mai'
WHEN 6 THEN 'Juni'
WHEN 7 THEN 'Juli'
WHEN 8 THEN 'August'
WHEN 9 THEN 'September'
WHEN 10 THEN 'Oktober'
WHEN 11 THEN 'November'
WHEN 12 THEN 'Dezember'
ELSE 'Unbekannt'
END AS month_name
FROM orders;
Hier macht das einfache CASE klar, was sonst nur als Zahlen von 1 bis 12 dastehen würde.
Umgang mit NULL im einfachen CASE
Wichtig zu wissen: Wenn du mit NULL vergleichst, kommt als Ergebnis NULL, weil NULL = NULL — das ist nicht wahr, sondern unbekannt.
Beispiel mit NULL:
SELECT
user_id,
status,
CASE status
WHEN 'active' THEN 'Aktiv'
WHEN 'blocked' THEN 'Gesperrt'
WHEN NULL THEN 'Kein Status' -- klappt nicht!
ELSE 'Unbekannt'
END AS user_state
FROM users;
Statt WHEN NULL solltest du ELSE nutzen oder einfach das suchende CASE (das wir in der letzten Vorlesung hatten):
CASE
WHEN status IS NULL THEN 'Kein Status'
...
Vergleich mit suchendem CASE
| Besonderheit | Einfaches CASE | Suchendes CASE |
|---|---|---|
| Vergleich mit konkreten Werten | ✅ Praktisch | ❌ Nicht geeignet |
| Flexible Bedingungen (>, IS NULL) | ❌ Geht nicht | ✅ Geht |
| Entsprechung in der Programmierung | switch-case |
if-else |
Praktische Anwendungsfälle
Beispiel: Status-Visualisierung einer Anfrage
| request_id | status |
|---|---|
| 101 | new |
| 102 | in_progress |
| 103 | done |
| 104 | cancelled |
| 105 | NULL |
SELECT
request_id,
CASE status
WHEN 'new' THEN '🟡 Neu'
WHEN 'in_progress' THEN '🔵 In Bearbeitung'
WHEN 'done' THEN '🟢 Abgeschlossen'
ELSE '⚪ Unbekannt'
END AS status_label
FROM requests;
| request_id | status_label |
|---|---|
| 101 | 🟡 Neu |
| 102 | 🔵 In Bearbeitung |
| 103 | 🟢 Abgeschlossen |
| 104 | ⚪ Unbekannt |
| 105 | ⚪ Unbekannt |
Hier wirkt CASE wie ein Übersetzer: Es macht technische Status zu verständlichen (und sogar netten) Labels. Und wenn der Status unbekannt oder NULL ist, bekommt der User ⚪ „Unbekannt“.
Beispiel: Gruppierung nach Kategorien für einen Bericht
| employee_id | name | department |
|---|---|---|
| 1 | Alex Lin | HR |
| 2 | Maria Chi | IT |
| 3 | Anna Song | IT |
| 4 | Otto Art | FIN |
| 5 | Jane Doe | HR |
| 6 | Max Gray | SALES |
| 7 | Zoe Black | IT |
| 8 | Tom Brown | FIN |
| 9 | Liam Park | NULL |
| 10 | Eva Gold | HR |
SELECT
CASE department
WHEN 'HR' THEN 'Personal'
WHEN 'IT' THEN 'Technologie'
WHEN 'FIN' THEN 'Finanzen'
ELSE 'Sonstiges'
END AS dept_name,
COUNT(*) AS staff_count
FROM employees
GROUP BY
CASE department
WHEN 'HR' THEN 'Personal'
WHEN 'IT' THEN 'Technologie'
WHEN 'FIN' THEN 'Finanzen'
ELSE 'Sonstiges'
END;
Ergebnis:
| dept_name | staff_count |
|---|---|
| Personal | 3 |
| Technologie | 3 |
| Finanzen | 2 |
| Sonstiges | 2 |
Was hier passiert:
- Mitarbeiter aus dem HR-Department landen in der Kategorie Personal.
- IT — das sind Technologie.
- FIN — das sind Finanzen.
- Alles andere, inklusive SALES und NULL, landet bei Sonstiges. So ein Ansatz ist super für freundliche und verständliche Berichte.
Typische Fehler
- ELSE vergessen → du bekommst
NULL, wenn kein Wert passt. - Mit
NULLvergleichen → klappt nicht, nutzeIS NULLund das suchendeCASE. - Unpassende Typen vergleichen → zum Beispiel
CASE grade WHEN '5', wenngradeein Zahlentyp ist.
Das einfache CASE ist dein Tool, wenn du einen Wert mit einer Menge möglicher vergleichen willst. Es ist kompakt, lesbar und besonders praktisch für Textklassifikation, Visualisierung, Code-Umwandlung und Gruppierung.
Wenn du aber Bereiche, NULL oder komplexere Bedingungen prüfen willst — nimm das suchende CASE. SQL mag Klarheit. Und CASE ist dein Werkzeug, um diese Klarheit zu schaffen.
GO TO FULL VERSION