SQL CASE WHEN: Beispiele und Tipps für Einsteiger
CASE WHEN ist der SQL-Weg, um if‑then‑else‑Logik direkt in eine Abfrage zu schreiben, ohne eine Programmiersprache zu brauchen. Ein minimales Beispiel zeigt es am schnellsten:
Funktionen
CASE WHEN ist der SQL-Weg, um if‑then‑else‑Logik direkt in eine Abfrage zu schreiben, ohne eine Programmiersprache zu brauchen. Ein minimales Beispiel zeigt es am schnellsten:
SELECT
Produktname,
Preis,
CASE WHEN Preis < 20 THEN 'Günstig'
WHEN Preis < 50 THEN 'Mittel'
ELSE 'Teuer'
END AS Preiskategorie
FROM Produkte;
SQL CASE wertet die WHEN‑Bedingungen der Reihe nach aus und gibt den THEN‑Wert der ersten wahren Bedingung zurück. Trifft keine zu und fehlt ELSE, liefert die Abfrage NULL.
Profi-Tipp: Schreibe immer einen ELSE-Zweig, auch wenn er nur 'Sonstiges' oder NULL explizit nennt. Das macht das Verhalten der Abfrage sofort lesbar und verhindert unerwartete Lücken im Ergebnis.
CASE WHEN implementiert if‑then‑else‑Logik in SQL-Ausdrücken, stoppt bei der ersten wahren Bedingung, und gibt ohne ELSE immer NULL zurück.
| Thema | Details |
| Zwei Formen | Simple CASE prüft Gleichheit; Searched CASE erlaubt beliebige Bedingungen wie >, BETWEEN, IS NULL. |
| ELSE immer angeben | Fehlt ELSE, liefert CASE NULL für alle nicht übereinstimmenden Zeilen. |
| Aggregationen | SUM(CASE WHEN ...) berechnet konditionale Kennzahlen in einem einzigen Tabellenscan. |
| Viele WHENs | Ab etwa acht Zweigen ist eine Lookup-Tabelle mit JOIN wartbarer und oft performanter. |
| LogicExcel | Interaktive SQL-Übungen im Browser zum direkten Ausprobieren von CASE WHEN. |
Es gibt zwei Formen, und der Unterschied ist praktisch relevant.
Simple CASE vergleicht einen Ausdruck auf Gleichheit:
CASE Bewertung
WHEN 1 THEN 'Schlecht'
WHEN 2 THEN 'Okay'
WHEN 3 THEN 'Gut'
ELSE 'Unbekannt'
END
Searched CASE wertet beliebige boolesche Ausdrücke aus, also auch >, <, BETWEEN, LIKE oder IS NULL:
CASE
WHEN Umsatz > 10000 THEN 'Top'
WHEN Umsatz BETWEEN 5000 AND 10000 THEN 'Mittel'
ELSE 'Niedrig'
END
Laut der PostgreSQL-Dokumentation stoppt die Auswertung beim ersten wahren WHEN. Das hat Konsequenzen: Überlappende Bedingungen liefern je nach Reihenfolge unterschiedliche Ergebnisse.
Wichtige Regeln auf einen Blick:
| Merkmal | Simple CASE | Searched CASE |
| Vergleichsart | Nur Gleichheit (=) | Beliebige Bedingungen |
| Typische Nutzung | Feste Wertelisten | Bereiche, NULL-Prüfungen, komplexe Logik |
| NULL-Verhalten | = NULL schlägt fehl | IS NULL funktioniert korrekt |
Drei Szenarien, die im Alltag immer wieder auftauchen.
Kategorisierung nach Preis
SELECT
Produktname,
CASE WHEN Preis < 20 THEN 'Günstig'
WHEN Preis < 50 THEN 'Mittel'
ELSE 'Teuer'
END AS Preiskategorie
FROM Produkte;
Das Ergebnis erscheint als neue Spalte Preiskategorie. Ohne AS zeigt die Datenbank einen automatisch generierten, oft unlesbaren Spaltennamen.
NULL-Werte explizit behandeln
SELECT
Kundenname,
CASE WHEN Email IS NULL THEN 'Keine Angabe'
ELSE Email
END AS Kontakt
FROM Kunden;
WHEN Email = NULL funktioniert nicht, weil NULL kein Wert ist, der mit = verglichen werden kann. Immer IS NULL verwenden.
Reihenfolge der WHENs entscheidet
CASE WHEN Score >= 90 THEN 'Sehr gut'
WHEN Score >= 70 THEN 'Gut'
WHEN Score >= 50 THEN 'Ausreichend'
ELSE 'Nicht bestanden'
END
Wer Score >= 50 an erste Stelle setzt, bekommt für alle Werte ab 50 sofort 'Ausreichend', egal ob der Score 95 ist. Die Reihenfolge ist keine Kleinigkeit.
Das Muster SUM(CASE WHEN ...) ist eines der nützlichsten Werkzeuge für Berichte und Dashboards. Statt mehrerer Abfragen berechnest du konditionale Kennzahlen in einem einzigen Durchlauf.
SELECT
Abteilung,
COUNT(*) AS Gesamt,
SUM(CASE WHEN Status = 'aktiv' THEN 1 ELSE 0 END) AS Aktive,
SUM(CASE WHEN Status = 'inaktiv' THEN 1 ELSE 0 END) AS Inaktive
FROM Mitarbeiter
GROUP BY Abteilung;
Die PostgreSQL-Dokumentation beschreibt dieses Muster als gängige Methode für konditionale Metriken. Kombiniert mit GROUP BY liefert es eine vollständige Pivot-ähnliche Auswertung ohne Subqueries.
Weitere Varianten:
Für die Kombination mit GROUP BY in SQL lohnt es sich, die Aggregationslogik sauber zu trennen: Bedingungen in CASE, Gruppierung in GROUP BY.
CASE ist ein Ausdruck, kein Statement. Überall, wo SQL einen Ausdruck erwartet, kann CASE stehen.
ORDER BY
CASE WHEN Status = 'dringend' THEN 0 ELSE 1 END,
Erstellungsdatum DESC;
HAVING SUM(CASE WHEN Retoure = 1 THEN 1 ELSE 0 END) > 5
UPDATE Produkte
SET Rabatt = CASE WHEN Lagerbestand > 100 THEN 0.2
WHEN Lagerbestand > 50 THEN 0.1
ELSE 0
END;
Wichtig: Laut W3Schools SQL CASE ersetzt CASE nicht WHERE. WHERE entscheidet, ob eine Zeile überhaupt erscheint. CASE verändert nur, was in einer Spalte steht.
Die Kernlogik ist überall gleich, aber die Details unterscheiden sich.
| DBMS | Besonderheit |
| SQL Server (T‑SQL) | Maximal 10 Verschachtelungsebenen; CASE in Aggregaten wird vollständig ausgewertet |
| PostgreSQL | Short-circuit-Evaluation: WHEN-Ausdrücke werden sequenziell geprüft, Seiteneffekte möglich |
| MySQL | Unterscheidet CASE-Expression (in Abfragen) und CASE-Statement (in Stored Programs mit END CASE) |
| Oracle | Sehr hohe Obergrenze für WHEN-Paare; Short-circuit-Verhalten dokumentiert |
MySQL unterscheidet klar zwischen der CASE-Expression in normalen Abfragen (endet mit END) und dem CASE-Statement in Stored Programs (endet mit END CASE). Wer das verwechselt, bekommt einen Syntaxfehler.
Oracle erlaubt eine sehr große Anzahl von WHEN-Paaren, was technisch viel Spielraum lässt, aber aus Wartbarkeitsgründen trotzdem nicht ausgereizt werden sollte.
Profi-Tipp: Wenn du Code zwischen DBMS portierst, teste NULL-Vergleiche zuerst. WHEN column = NULL schlägt in allen Systemen still fehl; WHEN column IS NULL funktioniert überall korrekt.
Noch ein Punkt, der Lernende oft verwirrt: CASE in SQL ist ein Ausdruck, kein Ablaufsteuerungselement. In Stored Procedures gibt es ein separates CASE-Statement mit anderer Syntax. Die Snowflake-Dokumentation beschreibt das sequenzielle Evaluationsverhalten und weist auf Short-circuiting hin.
Drei bis vier WHEN-Zweige sind kein Problem. Ab acht oder zehn wird der Code schnell unübersichtlich, und Änderungen werden fehleranfällig.
-- Statt:
CASE Ländercode
WHEN 'DE' THEN 'Deutschland'
WHEN 'AT' THEN 'Österreich'
WHEN 'CH' THEN 'Schweiz'
-- ... 40 weitere Zeilen
END
-- Besser:
SELECT p.*, l.Bezeichnung
FROM Produkte p
LEFT JOIN Laender l ON p.Ländercode = l.Code;
Laut Snowflake-Dokumentation steigt bei vielen Bedingungen die Komplexität erheblich; Referenztabellen sind wartbarer und oft auch performanter, weil der Optimizer Indizes nutzen kann.
Profi-Tipp: Wenn du denselben CASE-Block in mehr als zwei Abfragen kopierst, ist es Zeit für eine View oder eine Lookup-Tabelle. Doppelter Code bedeutet doppelter Wartungsaufwand.
Fehlender ELSE-Zweig: Die häufigste Ursache für unerwartete NULL-Werte in Berichten. Wer ELSE weglässt, bekommt NULL für alle Zeilen, die keine WHEN-Bedingung erfüllen.
Typkonflikte: Wenn ein THEN-Zweig '0' (Text) und ein anderer 0 (Zahl) zurückgibt, entscheidet SQL über implizite Konvertierung. Das Ergebnis ist nicht immer das erwartete. Einheitliche Typen in allen THEN/ELSE-Zweigen vermeiden das.
Falsche Reihenfolge bei überlappenden Bedingungen: Wer WHEN Score >= 50 vor WHEN Score >= 90 schreibt, bekommt für Score 95 den falschen Zweig. Spezifischere Bedingungen immer zuerst.
NULL-Vergleich mit =: WHEN Spalte = NULL ist immer falsch. Korrekt ist WHEN Spalte IS NULL.
Division durch null: Lässt sich mit CASE elegant verhindern:
CASE WHEN Nenner <> 0 THEN Zähler / Nenner ELSE 0 END
Die PostgreSQL-Dokumentation zeigt genau dieses Muster als Standardbeispiel für sichere Berechnungen.
Debugging-Tipp: Füge temporär eine Spalte CASE WHEN ... THEN 'Zweig A' WHEN ... THEN 'Zweig B' ELSE 'Kein Treffer' END AS debug_label hinzu. So siehst du sofort, welcher Zweig für welche Zeile greift.
Theorie hilft, aber Schreiben festigt. Hier sind fünf Aufgaben, die die wichtigsten Fälle abdecken:
CASE WHEN ist das Werkzeug, das aus einer reinen Datenabruf-Abfrage eine Analyse macht. Wer KPIs in einem Bericht berechnet, braucht oft keine separate Programmierlogik, wenn SUM(CASE WHEN ...) in einer einzigen Abfrage mehrere Metriken gleichzeitig liefert.
Was ich in der Praxis gelernt habe: Die größte Gefahr ist nicht die falsche Syntax, sondern die falsche Reihenfolge der WHEN-Zweige. Ein Fehler dort ist still. Keine Fehlermeldung, nur ein falsches Ergebnis, das in einem Dashboard wochenlang unbemerkt bleibt.
Verschachtelte CASE-Ausdrücke sind verlockend, weil sie viel Logik in wenige Zeilen packen. Aber ab einer gewissen Tiefe liest kein Mensch mehr, was der Code tut, auch nicht der Autor selbst drei Monate später. Ich ziehe dann eine View oder eine Lookup-Tabelle vor. Kombiniert mit Window Functions wie RANK() oder SUM() OVER (...) entfaltet CASE sein volles Potenzial, ohne dass der Code unlesbar wird.
Wer CASE WHEN wirklich beherrschen will, muss es schreiben, nicht nur lesen. LogicExcel bietet interaktive SQL-Übungen, die genau das ermöglichen: Aufgaben direkt im Browser lösen, sofortiges Feedback erhalten, ohne Installation.
Die Aufgaben decken Grundlagen wie SELECT und WHERE genauso ab wie Aggregationen mit GROUP BY und konditionale Logik mit CASE WHEN. Wer die fünf Übungsaufgaben aus dem vorherigen Abschnitt ausprobieren möchte, findet auf LogicExcel den passenden Rahmen dafür. Einfach die SQL-Übungsseite aufrufen und loslegen.
CASE WHEN Bedingung THEN Ergebnis ELSE Alternative END
Die Abfrage wertet WHEN-Zweige der Reihe nach aus und gibt den THEN-Wert der ersten wahren Bedingung zurück.
Fehlt ein ELSE-Zweig und trifft keine WHEN-Bedingung zu, liefert CASE automatisch NULL. Immer einen expliziten ELSE-Wert angeben, um das zu verhindern.
In Standard-SQL gibt es kein IF auf Ausdrucksebene. MySQL kennt IF(Bedingung, Wert_wahr, Wert_falsch) als Funktion, aber CASE WHEN ist portabler und funktioniert in SQL Server, PostgreSQL, MySQL und Oracle gleichermaßen.
Ja. CASE ist ein Ausdruck und darf überall stehen, wo SQL einen Ausdruck erwartet: in SELECT, ORDER BY, HAVING, WHERE und UPDATE SET.
Simple CASE vergleicht einen Ausdruck auf Gleichheit (CASE Spalte WHEN Wert THEN ...). Searched CASE wertet beliebige boolesche Ausdrücke aus (CASE WHEN Spalte > 100 THEN ...) und ist damit flexibler, besonders für Bereiche und NULL-Prüfungen.
Anleitungen, die andere als Nächstes lesen.

Erfahre, wie du mit der SQL ORDER BY-Klausel Daten effizient sortieren und die Performance deiner Abfragen optimieren kannst.
13 min
SQL-Tabellen verknüpfen mit JOIN: INNER, LEFT, RIGHT, Self Join, mehrere Tabellen, abweichende Spaltennamen und UNION, mit Beispielen zum Abtippen.
14 min
COALESCE in SQL verständlich erklärt: Syntax, sechs Praxisbeispiele, der Unterschied zu ISNULL und typische Fehler bei NULL-Werten in Reports.
12 min