CASE WHEN in SQL – Bedingungen direkt in der Abfrage
Mit CASE WHEN baust du Wenn-Dann-Logik direkt in SQL: abgeleitete Spalten, Kategorien aus Zahlen und der Trick, mit dem du in einer Abfrage nach mehreren Kriterien gleichzeitig zählst (bedingte Aggregation).
CASE WHEN ist das „if" von SQL. Damit rechnest du Bedingungen direkt in die Abfrage – statt die Daten roh zu holen und im Anwendungscode nachzubearbeiten.
Eine Kategorie aus einer Zahl ableiten
SELECT
name,
punkte,
CASE
WHEN punkte >= 90 THEN 'Gold'
WHEN punkte >= 70 THEN 'Silber'
WHEN punkte >= 50 THEN 'Bronze'
ELSE 'kein Rang'
END AS liga
FROM spieler;Die Zweige werden von oben nach unten geprüft, der erste Treffer gewinnt. Ohne passenden WHEN liefert ELSE den Standard (fehlt ELSE, kommt NULL heraus).
Der starke Trick: bedingte Aggregation
Hier spielt CASE seine Stärke aus. Du willst in einer Abfrage mehrere Kennzahlen nebeneinander – z. B. Bestellungen pro Status. Statt drei Abfragen zählst du mit CASE innerhalb von SUM/COUNT:
SELECT
COUNT(*) AS gesamt,
SUM(CASE WHEN status = 'bezahlt' THEN 1 ELSE 0 END) AS bezahlt,
SUM(CASE WHEN status = 'offen' THEN 1 ELSE 0 END) AS offen,
SUM(CASE WHEN status = 'storno' THEN 1 ELSE 0 END) AS storniert
FROM bestellungen;Jedes CASE liefert 1 oder 0, SUM zählt die Einsen. So bekommst du eine kompakte Übersichtszeile – im Grunde ein kleiner Pivot, ganz ohne Spezial-Syntax.
Auch beim Sortieren nützlich
ORDER BY
CASE WHEN status = 'offen' THEN 0 ELSE 1 END, -- offene zuerst
datum DESC;So ziehst du bestimmte Zeilen nach oben, ohne eine Hilfsspalte anzulegen.
CASE WHEN funktioniert in SQLite, PostgreSQL, MySQL und SQL Server gleich. Wenn du Auswertungen und Dashboards auf einer sauberen Datenbank brauchst, baue ich dir das – meld dich über bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
Wie viel mehr als gestern? Differenz zur Vorzeile mit LAG() in SQL
„Wie viele Besucher heute im Vergleich zu gestern?" – der Reflex ist ein Self-Join auf die Vorzeile. Mit der Fensterfunktion LAG() bekommst du den Wert der vorherigen Zeile direkt daneben, ohne die Tabelle ein zweites Mal anzufassen.
WITH RECURSIVE – Kategoriebäume und Kommentar-Threads in einer einzigen Abfrage
Kategorien mit Unterkategorien, Kommentare mit Antworten, Ordner in Ordnern: Die meisten holen sich so etwas mit einer Schleife und einer Abfrage pro Ebene. Eine rekursive CTE holt den ganzen Baum in einem Rutsch – inklusive Tiefe und Pfad.
UNION vs. UNION ALL – zwei Abfragen zusammenlegen, ohne Zeilen zu verlieren
UNION entfernt Duplikate. Das klingt hilfreich, kostet aber eine komplette Sortierung – und wirft dir stillschweigend echte Zeilen weg, die zufällig identisch aussehen. UNION ALL ist fast immer die richtige Wahl.