SQL CASE ist der if-then-else-Ausdruck von SQL: Er liefert je nach Bedingung unterschiedliche Werte – direkt im SELECT, aber auch in WHERE, ORDER BY oder beim UPDATE. CASE ist ein Ausdruck (keine Anweisung) und darf überall dort stehen, wo ein Wert erlaubt ist.
Die zwei Formen
Der durchsuchte CASE prüft einzelne Bedingungen:
SELECT name,
CASE WHEN preis < 10 THEN 'günstig'
WHEN preis < 50 THEN 'mittel'
ELSE 'teuer' END AS kategorie
FROM produkte;
Der einfache CASE vergleicht eine Spalte mit festen Werten:
SELECT name,
CASE status WHEN 'A' THEN 'aktiv'
WHEN 'I' THEN 'inaktiv' END AS zustand
FROM kunden;
CASE wertet von oben nach unten aus und stoppt beim ersten Treffer. Der ELSE-Zweig ist optional: Fehlt er und trifft keine Bedingung zu, ist das Ergebnis NULL – genau wie beim SQL-NULL-Konzept. Wer stattdessen einen Ersatzwert für NULL sucht, nutzt COALESCE.
Typische Einsatzorte
- SELECT: berechnete Spalten, Aufbereitung für Berichte.
- WHERE: komplexe Filter wie
WHERE CASE WHEN ... THEN 1 ELSE 0 END = 1. - ORDER BY: eigene Sortierlogik, etwa NULL-Werte ans Ende schieben.
- UPDATE: bedingte Wertzuweisung, z.B.
SET status = CASE WHEN ... THEN 'neu' ELSE status END.
Pivot: Zeilen zu Spalten
Für diesen Fall gibt es in SQL Server und Oracle den eigenen Operator PIVOT – sein Gegenstück UNPIVOT dreht Spalten zurück in Zeilen.
Klassisch ist CASE in Kombination mit Aggregatfunktionen, um aus Zeilen Spalten zu machen – etwa Umsatz je Monat in einer Zeile:
SELECT jahr,
SUM(CASE WHEN monat = 1 THEN umsatz ELSE 0 END) AS januar,
SUM(CASE WHEN monat = 2 THEN umsatz ELSE 0 END) AS februar
FROM verkauf GROUP BY jahr;
Grundlagen zu Aggregaten und Gruppierung stehen in SQL GROUP BY; die Syntax ist Bestandteil des SQL-Standards und funktioniert in MySQL, MariaDB, PostgreSQL, SQL Server (dort auch T-SQL) und Oracle. Auch beim Einfügen mit INSERT oder Löschen mit DELETE kann CASE Werte bedingt aufbereiten.