Die SQL CASE Anweisung durchläuft eine Liste von Bedingungen und gibt einen Wert zurück, wenn eine Bedingung erfüllt ist. Auf jede CASE Anweisung folgt ein WHEN, THEN, ELSE und END. Damit kann man Logik in die Abfragen einbinden.
CASE
WHEN Bedingung
THEN Ergebnis
ELSE Anderes_Ergebnis
END;
Was ist eine SQL CASE-Anweisung?
SQL CASE ist ganz simpel: Wenn Bedingung, dann Befehl. Sobald eine Bedingung wahr ist, stoppt CASE das Lesen und gibt das Ergebnis zurück.
Wenn keine Bedingung erfüllt ist, gibt es den Wert in der ELSE-Klausel zurück. Wenn es keine ELSE-Klausel gibt und die Bedingungen FALSE sind, gibt es NULL zurück.
Wo wird SQL CASE angewendet?
Mit Bedingungen kann man in der Datenwelt viele Dinge anstellen. Darunter fallen:
- Datenaggregation: Mit CASE kann man bei Aggregatfunktionen wie SUM, COUNT, AVG bedingte Berechnungen durchführen.
- Datenfilterung: Man kann Daten basierend auf Bedingungen auswählen oder herausfiltern.
- Datenbereinigung: Man kann Daten bereinigen, indem man bspw. fehlende Werte ersetzt oder bestimmte Werte basierend auf bestimmten Kriterien korrigieren.
- Bedingte Anzeige: Mit CASE kann man beispielsweise bestimmte Spalten oder Werte nur anzeigen, wenn bestimmte Bedingungen erfüllt sind.
SQL CASE Syntax und Struktur
- Wie der Name sagt, beginnt man die SQL CASE-Anweisung mit einem CASE.
- Darauf folgt der Wert bzw. der Spaltenname, den wir untersuchen möchten. Dieser ist nicht zwingend notwendig, wenn wir unterschiedliche Spalten analysieren möchten.
- Hier beginnt die erste Bedingung. Man startet mit einem WHEN.
- Hinter dem WHEN folgt die Bedingung, die ähnlich wie eine WHERE-Klausel aus Logik aufgebaut ist. Wenn man in Schritt 2 aber eine Spalte benennt, kann man hier die Werte eingeben, die diese Spalte entsprechen soll.
- Wenn die Bedingung wahr ist, springt man zum THEN. Dieser erklärt welcher Wert im Falle dieser Bedingung eingesetzt werden soll.
- Wenn die Bedingung falsch ist, springt man entweder zur nächsten „WHEN… THEN…“-Anweisung oder man nutzt ein ELSE.
- Hinter dem ELSE folgt das Ergebnis, das eingesetzt wird, wenn alle vorherigen Bedingungen nicht eingetroffen sind.
- Am Ende folgt ein END. Man kann sich vorstellen dass das CASE das Öffnen einer Klammer ist und END das Schließen der Klammer.
CASE Spalte # Spalte ist optional
WHEN Bedingung_1 THEN Ergebnis_1
WHEN Bedingung_2 THEN Ergebnis_2
ELSE Ergebnis_3
END;
Zusätzliche Informationen zur Struktur von SQL CASE
Die Bedingung ist mit den WHERE-Bedingungen zu vergleichen. Sämtliche Operatoren können hier verwendet werden.
Das Ergebnis kann ein Wert sein, oder aber eine Unterabfrage.
Es können ebenfalls CASE-Ausdrücke verschachtelt werden. CASE kann mehrere WHEN und THEN Paare enthalten, um mehrere Bedingungen mit unterschiedlichen Ergebnissen zu nutzen.
Arten von SQL CASE-Anweisungen
Der CASE-Ausdruck hat zwei Formate: Simple CASE und Searched CASE. Sie unterscheiden sich eigentlich nur darin, wie die Bedingung geschrieben wird.
Simple CASE: Einfache Spaltenabgleiche
Beim Simple Case werden nicht direkt Bedingungen geschrieben, sondern Werte verwendet, die abgeglichen werden. Es ist so als würde man einen Ist-Gleich Operator (=) ausführen.
CASE Spalte # Hier existiert eine Spalte
WHEN Wert_1 THEN Ergebnis_1
WHEN Wert_2 THEN Ergebnis_2
ELSE Ergebnis_3
END;
Searched CASE: Komplexe Bedingungen leicht gemacht
Größer-/Kleiner-Als oder spezifische Logik mit verschiedenen Spalten ist also nicht möglich. Für solche Fälle muss also immer der Searched Case benutzt werden.
Bei diesem lässt man den Spaltennamen weg, fügt aber eine Bedingung anstelle eines Wertes hinter dem WHEN hinzu.
Der Searched Case lässt sich also flexibler anwenden, aber verlängert den Code im Vergleich zum Simple Case.
CASE # Hier existiert keine Spalte
WHEN Bedingung_1 THEN Ergebnis_1
WHEN Bedingung_2 THEN Ergebnis_2
ELSE Ergebnis_3
END;
Beispiele von SQL CASE-Anweisungen
SQL Simple Case - Beispiel
Unsere Online-Videothek FlatNix hat langsam sehr viele Kunden. Zu viele. Die Kundentabelle ist viel zu groß. Deswegen möchten wir einige Spalten kürzen. Wir wandeln jedes „Männlich“ in „M“ um, jedes „Weiblich“ in „W“ und alle anderen Werte in NULL um:
SELECT
CASE Geschlecht
WHEN 'Männlich'
THEN 'M'
WHEN 'Weiblich'
THEN 'W'
ELSE NULL
END;
SQL Searched Case - Beispiel
FlatNix möchte natürlich Kindern keine Horrorfilme empfehlen. Mit dem Case teilen wir die Altersklassen auf in Kind (< 12 Jahre alt), Teenager (zwischen 12 und 17 Jahre alt) und Erwachsener (18 und älter):
SELECT
CASE
WHEN Alter < 12
THEN 'Kind'
WHEN Alter >= 12 AND Alter < 18
THEN 'Teenager'
ELSE 'Erwachsener'
END
FROM Kunden;
CASE zusammen mit Berechnungen
Häufig wird CASE auch zusammen mit Aggregationsfunktionen wie z.B. SUM (Summe), AVG (Durchschnitt) oder COUNT (Zählen) verwendet.
Wir können bspw. unter allen Tieren in unserer Liste die Gruppen verändern. Wenn die Werte in der Spalte Tier eine Katze oder ein Hund sind, ändern wir den Wert zu Haustier. Alle anderen Tiere in der Liste nennen wir Wilde Bestie.
Als weitere Spalte fügen wir COUNT() hinzu, um alle Haustiere bzw. Wilden Bestien zu zählen. Um Aggregationsfunktionen zu benutzen, muss man immer GROUP BY benutzen, damit man nach der Tierkategorie gruppieren kann.
ID | Tier |
---|---|
1 | Hund |
2 | Katze |
3 | Grizzlybär |
4 | Krokodil |
5 | Goldfisch |
Im ersten Schritt geben wir den Tiernamen aus und finden heraus, welche Tierkategorie als Output ausgegeben wird:
SELECT Tier,
CASE Tier
WHEN 'Katze' THEN 'Haustier'
WHEN 'Hund' THEN 'Haustier'
ELSE 'Wilde Bestie'
END AS Tierkategorie,
FROM Tiere;
Tiere | Tierkategorie |
---|---|
Hund | Haustier |
Katze | Haustier |
Grizzlybär | Wilde Bestie |
Krokodil | Wilde Bestie |
Goldfisch | Wilde Bestie |
Daraus bauen wir dann unsere Aggregation, indem wir ein GROUP BY hinzufügen und einen COUNT() zu unseren Spalten anhängen. Damit werden die Tierkategorien gruppiert und gezählt.
SELECT
CASE Tier
WHEN 'Katze' THEN 'Haustier'
WHEN 'Hund' THEN 'Haustier'
ELSE 'Wilde Bestie'
END AS Tierkategorie,
COUNT(1) AS Anzahl
FROM Tiere
GROUP BY Tierkategorie;
Output |
|
Tierkategorie | Anzahl |
---|---|
Haustier | 2 |
Wilde Bestie | 3 |
CASE innerhalb von Berechnungen
SQL CASE lässt sich auch innerhalb von Aggregationsfunktionen einsetzen.
Fach | Note | Schüler |
---|---|---|
Mathematik | 1 | Anna |
Englisch | 2 | Anna |
Mathematik | 3 | Bernd |
Englisch | 1 | Bernd |
Mathematik | 2 | Chris |
Um CASE innerhalb von Berechnungen einzusetzen, muss man eine Spalte haben, die sich für eine GROUP BY Anweisung eignet. In unserem Fall ist es das Fach.
Im SELECT fügen wir das Fach hinzu und für jeden Fall wird eine eigene COUNT-Funktion benutzt. Möchten wir alle Einsen, Zweien und Dreien zählen, muss innerhalb der COUNT-Funktion ein CASE gesetzt werden.
In unserem Fall prüfen wir ob die Note bspw. eine 1 ist. Falls ja, vergeben wir mit dem CASE einen beliebigen Wert. Falls nein, setzen wir den Wert auf NULL, weil dieser im COUNT-Befehl nicht gezählt wird.
Das gibt uns die Anzahl der Einsen, Zweien und Dreien wieder.
SELECT Fach,
COUNT(CASE
WHEN Note = 1 THEN 1
ELSE NULL
END) AS Anzahl_Einsen,
COUNT(CASE
WHEN Note = 2 THEN 1
ELSE NULL
END) AS Anzahl_Zweien,
COUNT(CASE
WHEN Note = 3 THEN 1
ELSE NULL
END) AS Anzahl_Dreien
FROM Schulnoten
GROUP BY Fach;
Fach | Anzahl_Einsen | Anzahl_Zweien | Anzahl_Dreien |
---|---|---|---|
Mathematik | 1 | 1 | 1 |
Englisch | 1 | 1 | 0 |
Häufige Fehler und wie man sie vermeidet
Vergessene ELSE-Klausel
Ein häufiger Fehler besteht darin, die ELSE-Klausel im CASE-Ausdruck zu vergessen. Die ELSE-Klausel definiert nämlich, was passieren soll, wenn keiner vorherige Bedingung erfüllt ist.
Manchmal denkt man sich, dass sowieso nur Fall A oder B auftreten kann, weswegen man denkt, dass mit zwei „WHEN… THEN…“ alle Fälle abgedeckt sind. Häufig kommt es aber vor, dass sich das Modell ändert und dann muss man wieder dringend Anpassungen vornehmen.
Daher ist es wesentlich solide Werte für eine ELSE-Klausel zu definieren.
Falsche Syntax
Ich vergesse die Syntax häufig selbst. Entweder verwechsele ich sie mit einer anderen Programmiersprache oder ich vergesse das END.
Stelle also sicher, dass du CASE, WHEN, THEN, ELSE und END in deiner SQL-Abfrage hast.
Nicht-übereinstimmende Datentypen
Wenn die Datentypen bei der Bedingung nicht übereinstimmen, kann es zu einer Fehlermeldung kommen. Stelle daher sicher, dass die Werte in deiner Spalte auch den Datentypen deiner Logik entsprechen.
Mehrere Treffer
Die Anordnung der Bedingungen kann die Logik des CASE-Ausdrucks stark verändern. Beim ersten Treffer wird also der CASE beendet. Könnten mehrere Fälle zutreffen, kann es sein, dass am Ende der falsche Wert wiedergegeben wird.
Daher ist es wichtig, die Daten zu kennen und alle Bedingungen zu hinterfragen. Alternativ kann man in diesem Fall mehrere Spalten mit CASEs verwenden.
Komplexität der CASE-Ausdrücke
Ein häufiger Fehler besteht darin, CASE-Ausdrücke unnötig komplex zu gestalten. Es ist wichtig, die Lesbarkeit der Abfragen zu gewährleisten und unnötig verschachtelte CASE-Ausdrücke zu vermeiden.
Bei komplexen logischen Verknüpfungen kann es hilfreich sein, zusätzliche Tabellen oder Unterabfragen zu verwenden, um die Abfrage besser strukturieren zu können.
Simple CASE und NULL Werte
Problematisch wird der Simple Case beim Einsetzen von NULL Werten, da in den meisten SQL-Systemen das Ergebnis von „NULL = NULL“ weder TRUE noch FALSE ist. Für solche Fälle eignet sich der Searched CASE.