CodeGym /Kurse /SQL SELF /Bedingte Ausdrücke: CASE <Ausdruck> WHEN ......

Bedingte Ausdrücke: CASE <Ausdruck> WHEN ... THEN ... ELSE ... END

SQL SELF
Level 10 , Lektion 1
Verfügbar

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 Werten value1, value2 usw. verglichen wird.
  • THEN gibt 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 NULL vergleichen → klappt nicht, nutze IS NULL und das suchende CASE.
  • Unpassende Typen vergleichen → zum Beispiel CASE grade WHEN '5', wenn grade ein 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.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION