LXLogicExcel
🔥
0
0

SQL CASE WHEN: Beispiele und Tipps für Einsteiger

By the LogicExcel Editorial TeamUpdated June 202612 min read2,266 words

SQL CASE WHEN: Beispiele und Tipps für Einsteiger

Von Hand SQL-CASE-WHEN-Anweisungen ins Notizbuch schreiben 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: Schreiben Sie 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.

Wichtige Erkenntnisse

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.
ThemaDetails
Zwei FormenSimple CASE prüft Gleichheit; Searched CASE erlaubt beliebige Bedingungen wie >, BETWEEN, IS NULL.
ELSE immer angebenFehlt ELSE, liefert CASE NULL für alle nicht übereinstimmenden Zeilen.
AggregationenSUM(CASE WHEN ...) berechnet konditionale Kennzahlen in einem einzigen Tabellenscan.
Viele WHENsAb etwa acht Zweigen ist eine Lookup-Tabelle mit JOIN wartbarer und oft performanter.
LogicexcelKostenlose, interaktive SQL-Übungen im Browser zum direkten Ausprobieren von CASE WHEN.

Inhaltsverzeichnis

Wie ist die Syntax von SQL CASE WHEN aufgebaut?

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:

  • Rückgabetyp: SQL wählt den Typ nach Typ-Präzedenz aus allen THEN/ELSE-Werten. Mischen Sie VARCHAR und INT, kann es zu impliziter Konvertierung oder Fehlern kommen.
  • Fehlendes ELSE: Gibt NULL zurück, nicht leer, nicht null-Byte.
  • Verschachtelung: Technisch möglich, aber in T‑SQL auf 10 Ebenen begrenzt (dazu mehr in Abschnitt 6).
MerkmalSimple CASESearched CASE
VergleichsartNur Gleichheit (=)Beliebige Bedingungen
Typische NutzungFeste WertelistenBereiche, NULL-Prüfungen, komplexe Logik
NULL-Verhalten= NULL schlägt fehlIS NULL funktioniert korrekt

Praktische Beispiele: Kategorisieren, NULLs behandeln, mehrere WHENs

Drei Szenarien, die im Alltag immer wieder auftauchen.

Kategorisierung nach Preis Mit farbigen Etiketten werden Datenzeilen von Hand sortiert und kategorisiert.
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.

Wie nutzen Sie CASE WHEN in Aggregationen?

Das Muster SUM(CASE WHEN ...) ist eines der nützlichsten Werkzeuge für Berichte und Dashboards. Statt mehrerer Abfragen berechnen Sie 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:

  • AVG(CASE WHEN Kategorie = 'A' THEN Umsatz ELSE NULL END) berechnet den Durchschnitt nur für Kategorie A. NULL-Werte werden von AVG ignoriert.
  • COUNT(CASE WHEN Bedingung THEN 1 END) zählt Zeilen, die die Bedingung erfüllen. Das fehlende ELSE gibt hier bewusst NULL zurück, was COUNT nicht zählt.
Profi-Tipp: Bei großen Tabellen ist ein einzelner Scan mit mehreren konditionalen Aggregaten deutlich schneller als mehrere separate Abfragen. Das gilt besonders, wenn die Tabelle nicht vollständig im Cache liegt.

Für die Kombination mit GROUP BY in SQL lohnt es sich, die Aggregationslogik sauber zu trennen: Bedingungen in CASE, Gruppierung in GROUP BY.

Wo darf CASE überall stehen?

CASE ist ein Ausdruck, kein Statement. Überall, wo SQL einen Ausdruck erwartet, kann CASE stehen.
  • SELECT: Klassische Verwendung zur Ausgabe transformierter Werte, wie in allen Beispielen oben.
  • ORDER BY: Bedingte Sortierung, etwa um bestimmte Werte an den Anfang zu stellen:
ORDER BY
    CASE WHEN Status = 'dringend' THEN 0 ELSE 1 END,
    Erstellungsdatum DESC;
  • WHERE: Selten nötig, aber möglich, wenn die Bedingung selbst variabel ist. Direkte Bedingungen sind meist klarer.
  • HAVING: Nützlich, wenn die Filterbedingung auf einem konditionalen Aggregat basiert:
HAVING SUM(CASE WHEN Retoure = 1 THEN 1 ELSE 0 END) > 5
  • UPDATE/SET: Ein konditionaler Update in einer Anweisung statt mehrerer:
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.

Was unterscheidet SQL Server, PostgreSQL, MySQL und Oracle?

Die Kernlogik ist überall gleich, aber die Details unterscheiden sich.

DBMSBesonderheit
SQL Server (T‑SQL)Maximal 10 Verschachtelungsebenen; CASE in Aggregaten wird vollständig ausgewertet
PostgreSQLShort-circuit-Evaluation: WHEN-Ausdrücke werden sequenziell geprüft, Seiteneffekte möglich
MySQLUnterscheidet CASE-Expression (in Abfragen) und CASE-Statement (in Stored Programs mit END CASE)
OracleSehr hohe Obergrenze für WHEN-Paare; Short-circuit-Verhalten dokumentiert
Die T‑SQL-Dokumentation von Microsoft nennt explizit die Grenze von 10 Verschachtelungsebenen. Wer tiefer schachtelt, bekommt einen Compilerfehler. In der Praxis ist das selten ein Problem, weil stark verschachtelte CASE-Ausdrücke ohnehin schwer lesbar sind. 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 Sie Code zwischen DBMS portieren, testen Sie 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.

Wann ist CASE lesbar, und wann wird es zum Problem?

Drei bis vier WHEN-Zweige sind kein Problem. Ab acht oder zehn wird der Code schnell unübersichtlich, und Änderungen werden fehleranfällig.

  • Einrückung: Jeden WHEN-Zweig in eine eigene Zeile, THEN bündig ausrichten. Das kostet keine Laufzeit und spart Minuten beim Lesen.
  • ELSE immer definieren: Auch wenn der Fall „eigentlich nicht vorkommen kann“. Daten sind selten so sauber wie erwartet.
  • Viele WHENs: Ab einer gewissen Anzahl ist eine Lookup-Tabelle die bessere Wahl.
-- 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 Sie denselben CASE-Block in mehr als zwei Abfragen kopieren, ist es Zeit für eine View oder eine Lookup-Tabelle. Doppelter Code bedeutet doppelter Wartungsaufwand.

Welche Fehler passieren mit CASE WHEN am häufigsten?

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ügen Sie temporär eine Spalte CASE WHEN ... THEN 'Zweig A' WHEN ... THEN 'Zweig B' ELSE 'Kein Treffer' END AS debug_label hinzu. So sehen Sie sofort, welcher Zweig für welche Zeile greift.

Welche Fehler passieren mit CASE WHEN am häufigsten? — overview diagram

So üben Sie CASE WHEN praktisch

Theorie hilft, aber Schreiben festigt. Hier sind fünf Aufgaben, die die wichtigsten Fälle abdecken:

  • Kategorisieren: Schreiben Sie eine Abfrage, die Produkte nach Preis in 'Günstig' (unter 20), 'Mittel' (20–50) und 'Teuer' (über 50) einteilt. Nutzen Sie AS Preiskategorie.
  • NULLs behandeln: Erstellen Sie eine Abfrage, die fehlende E-Mail-Adressen als 'Keine Angabe' ausgibt, vorhandene unverändert lässt.
  • Aggregation: Berechnen Sie mit SUM(CASE WHEN Status = 'aktiv' THEN 1 ELSE 0 END) die Anzahl aktiver Nutzer pro Abteilung.
  • ORDER BY mit CASE: Sortieren Sie eine Kundenliste so, dass VIP-Kunden immer oben erscheinen, alle anderen alphabetisch danach.
  • UPDATE mit CASE: Schreiben Sie ein UPDATE, das Rabatte abhängig vom Lagerbestand setzt: über 100 Einheiten 20 %, über 50 Einheiten 10 %, sonst 0 %.
Die interaktiven SQL-Übungen auf Logicexcel eignen sich gut, um diese Aufgaben direkt im Browser auszuprobieren und sofortiges Feedback zu bekommen, ohne lokale Datenbank oder Installation.

Was ich an CASE WHEN wirklich schätze

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.

Logicexcel: SQL direkt im Browser üben

Wer CASE WHEN wirklich beherrschen will, muss es schreiben, nicht nur lesen. Logicexcel bietet kostenlose SQL-Übungen, die genau das ermöglichen: Aufgaben direkt im Browser lösen, sofortiges Feedback erhalten, ohne Anmeldung oder Installation.

Logicexcel

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.

Quellen

FAQ

Wie schreibt man CASE WHEN in SQL?

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.

Warum gibt CASE WHEN manchmal NULL 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.

Wann nimmt man IF statt CASE in SQL?

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.

Kann CASE WHEN in WHERE und ORDER BY stehen?

Ja. CASE ist ein Ausdruck und darf überall stehen, wo SQL einen Ausdruck erwartet: in SELECT, ORDER BY, HAVING, WHERE und UPDATE SET.

Was ist der Unterschied zwischen Simple CASE und Searched CASE?

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.

Empfehlung