Zurück zur Artikelliste Artikel
10 Leseminuten

Was ist CASE in SQL?

SQL CASE ist ein sehr nützlicher Ausdruck, der Ihren SQL-Abfragen eine Wenn-dann-Logik verleiht. Es ist ein etwas fortgeschritteneres Thema, aber Sie werden es bei der Erstellung von Berichten brauchen - es wird einen enormen Nutzen für Ihre persönlichen und beruflichen Projekte bringen.

Die SQL-Anweisung CASE ist ein Kontrollfluss-Tool, mit dem Sie einer Abfrage eine if-else-Logik hinzufügen können. Im Allgemeinen können Sie die Anweisung CASE überall dort verwenden, wo ein gültiger Ausdruck möglich ist, z. B. mit den Klauseln SELECT, WHERE und GROUP BY.

Der Ausdruck CASE durchläuft jede Bedingung und gibt einen Wert zurück, wenn die erste Bedingung erfüllt ist. Sobald eine Bedingung erfüllt ist, gibt CASE das angegebene Ergebnis zurück. Wenn keine Bedingung erfüllt ist, wird der Wert aus der ELSE Klausel zurückgegeben. Wenn es kein ELSE gibt und keine Bedingung erfüllt ist, wird NULL zurückgegeben.

Einfaches SQL CASE-Beispiel

Hier ist die Syntax für den SQL CASE Ausdruck:

CASE 
  		WHEN condition_1 THEN result_1
   		WHEN condition_2 THEN result_2
   		ELSE else_result
END 

In dieser Syntax vergleicht SQL CASE den Wert entweder mit condition_1 oder condition_2. Wird eine Übereinstimmung gefunden, gibt die Anweisung das entsprechende Ergebnis zurück (result_1, wenn der Wert mit condition_1 übereinstimmt, oder result_2, wenn er mit condition_2 übereinstimmt). Trifft der Wert auf keine der beiden Bedingungen zu, wird else_result zurückgegeben. Die Anweisung ELSE ist optional und bietet die Möglichkeit, Werte zu erfassen, die nicht in den Anweisungen WHEN..THEN angegeben sind. Schließlich muss jede CASE -Anweisung mit dem Schlüsselwort END enden.

Der Datentyp des Ergebnisses der SQL-Anweisung CASE hängt von dem Kontext ab, in dem sie verwendet wird. Wird der Ausdruck CASE beispielsweise mit CHAR-Strings verwendet, wird das Ergebnis als CHAR-String zurückgegeben. Wenn der Ausdruck CASE in einem numerischen Kontext verwendet wird, wird das Ergebnis als Ganzzahl, Dezimalzahl oder Realwert zurückgegeben. Die Beherrschung dieses leistungsstarken Kontrollfluss-Tools eröffnet viele neue Möglichkeiten, Daten auf kreative Weise abzurufen und anzuzeigen, wie in diesem Artikel über das Hinzufügen von Logik zu Ihrer SQL-Abfrage mit CASE gezeigt wird.

Wenden wir nun die SQL-Anweisung CASE auf ein praktisches Beispiel an. Stellen Sie sich vor, wir haben einen kleinen Lebensmittelladen und verwenden eine einfache Datenbanktabelle, um unseren Bestand zu erfassen. Die Tabelle stock Tabelle enthält den Artikel, den Preis des Artikels und die Menge des Artikels, die derzeit auf Lager ist.

ItemPriceQuantity
Bread1.5923
Milk2.003
Coffee3.2987
Sugar0.790
Eggs2.2053
Apples1.9917

Was wäre, wenn wir unsere Daten mit einer einfachen Beschreibung versehen wollten, um mehr Kontext für unsere Berichte zu erhalten? Das lässt sich mit CASE WHEN leicht bewerkstelligen:

SELECT Item, Price,
       CASE 
   WHEN Price < 1.00 THEN 'Below $1.00'
	   WHEN Price >= 1.00 THEN 'Greater or Equal to $1.00'
       END AS 'Price Description'
  FROM stock

Zunächst gibt SELECT an, dass wir Daten aus unseren Spalten Item und Price abrufen wollen. Als nächstes folgt die Anweisung CASE. Wenn Price unter 1,00 liegt, geben wir die Zeichenfolge "Below $1.00" zurück. Wenn Price größer oder gleich 1,00 ist, wollen wir die Zeichenfolge "Größer oder gleich $1,00" zurückgeben. Dies wird auf jeden Price Wert in unserer Tabelle angewendet.

Außerdem geben wir an, dass die von der Anweisung CASE WHEN zurückgegebenen Werte in einer Spalte mit der Bezeichnung Preisbeschreibung stehen sollen:

ItemPricePrice Description
Brea1.59Greater or Equal to $1.00
Milk2.00Greater or Equal to $1.00
Coffee3.29Greater or Equal to $1.00
Sugar0.79Below $1.00
Eggs2.20Greater or Equal to $1.00
Apples1.99Greater or Equal to $1.00

Da haben wir es! Für jede Zeile, in der der Wert von Price unter 1,00 liegt, wird die Zeichenfolge "Below $1.00" zurückgegeben. Für Price Werte, die größer oder gleich 1,00 sind, wird die Zeichenfolge "Größer oder gleich $1,00" zurückgegeben. Die Ergebnisse werden in der Spalte Preisbeschreibung angezeigt.

SQL CASE WHEN mit ELSE

Wenn Sie ELSE verwenden, muss diese Anweisung nach jeder CASE WHEN Bedingung stehen, die Sie angegeben haben. Nehmen wir nun an, dass wir die verschiedenen Preise in unserer Tabelle in 3 verschiedene Kategorien einteilen wollen:

  • Artikel unter $1.00.
  • Artikel zwischen $1.00 und $3.00.
  • Artikel über $3.00.

Wir verwenden die Anweisung ELSE, um Price Werte über 3,00 zu behandeln:

SELECT Item, Price,
       CASE WHEN Price < 1.00 THEN 'Below $1.00'
	   WHEN Price >= 1.00 AND Price <= 3.00 THEN 'Between $1.00 and $3.00'
	   ELSE 'Above $3.00' 
       END AS 'Price Description'
  FROM stock

Die Price jeder Zeile wird daraufhin überprüft, ob sie gleich oder unter 1,00 oder zwischen 1,00 und 3,00 liegt. Wenn er in eine dieser Kategorien fällt, wird die entsprechende Zeichenfolge zurückgegeben. Wenn Price nicht unter 3,00 liegt, wird die Anweisung ELSE aufgerufen. Unsere Anweisung ELSE gibt die Zeichenfolge "Über 3,00 $" zurück.

Aus diesem Grund ist die Reihenfolge der Anweisungen wichtig. SQL wertet jede CASE der Reihe nach aus und gelangt schließlich zur ELSE, wenn keine Bedingungen erfüllt wurden.

ItemPricePrice Description
Bread1.59Between $1.00 and $3.00
Milk2.00Between $1.00 and $3.00
Coffee3.29Above $3.00
Sugar0.79Below $1.00
Eggs2.20Between $1.00 and $3.00
Apples1.99Between $1.00 and $3.00

Verwendung mehrerer CASES

Der Hauptgrund für die Verwendung der SQL-Anweisung CASE ist, dass mehrere Bedingungen ausgewertet werden sollen. Man möchte eine Reihe von Prüfungen durchführen und die Ergebnisse in aussagekräftige Daten umwandeln, normalerweise in Form eines Berichts.

Nehmen wir an, wir möchten einen einfachen Bericht für unsere stock Tabelle erstellen. Er soll uns mitteilen, ob der Lagerbestand hoch, mittel, niedrig oder gar nicht mehr vorhanden ist! Dies lässt sich leicht mit CASE erreichen:

SELECT Item,
      CASE WHEN Quantity > 0 AND Quantity <= 20 THEN 'Low'
            WHEN Quantity > 20 AND Quantity <= 50 THEN 'Medium'
            WHEN Quantity > 50 THEN 'High'
            ELSE 'Out Of Stock' 
		END AS 'Stock Level'
  	FROM stock

Dies ist unser bisher komplexestes Beispiel. Lassen Sie uns diese SQL-Abfrage aufschlüsseln.

Unser Ergebnis wird zwei Spalten haben. Die erste Spalte ist Item, mit der wir explizit auswählen:

SELECT Item

Die zweite Spalte ist die Ergebnisspalte, die durch unsere SQL-Ausdrücke CASE WHEN erzeugt wird und die wir Stock Level nennen:

END AS 'Stock Level'

Gehen wir nun die einzelnen Bedingungen in der Reihenfolge durch, in der SQL sie auswerten würde.

Zunächst prüft SQL, ob Quantity größer als Null und kleiner oder gleich 20 ist.

	CASE WHEN Quantity > 0 AND Quantity <= 20 THEN 'Low'

Wenn dies der Fall ist, wird "Low" zurückgegeben, und die Auswertung der nächsten Zeile beginnt.

Ist das Ergebnis falsch, schaut der Evaluator auf die nächste CASE Anweisung:

WHEN Quantity > 20 AND Quantity <= 50 THEN 'Medium'

Quantity Es wird erneut geprüft, ob der Wert größer als 20 und kleiner oder gleich 50 ist, und wenn dies der Fall ist, wird die Zeichenfolge "Mittel" zurückgegeben. Wenn diese Bedingung nicht erfüllt ist, wird die nächste Bedingung geprüft:

WHEN Quantity > 50 THEN 'High'

Die letzte Anweisung CASE prüft, ob Quantity größer als 50 ist, und gibt in diesem Fall die Zeichenfolge "High" zurück.

Es gibt noch eine weitere Situation, die von unseren verschiedenen CASE Anweisungen nicht abgedeckt wird. Was ist, wenn die Quantity einer bestimmten Item 0 ist? Schauen Sie sich unsere CASE Anweisungen noch einmal genau an:

		CASE WHEN Quantity > 0 AND Quantity <= 20 THEN 'Low'
		

Wir prüfen, ob Quantity größer als 0 ist, d. h. wenn es gleich 0 ist, wird diese Bedingung als falsch ausgewertet und die Datenbank fährt mit der Prüfung der anderen CASE -Anweisungen fort. Aus diesem Grund haben wir die Anweisung ELSE in unsere SQL-Abfrage aufgenommen:

ELSE 'Out Of Stock' 

Damit wird genau dieses Szenario abgedeckt. Wenn die Quantity einer Item gleich 0 ist, gelangt der SQL-Auswerter zu unserer ELSE -Anweisung und gibt "Out of Stock" zurück.

Die Ausführung dieser Abfrage führt zu folgendem Ergebnis:

ItemStock Level
BreadMedium
MilkLow
CoffeeHigh
SugarOut Of Stock
EggsHigh
ApplesLow

Wir können sehen, dass Zucker einen Quantity von 0 hat, was dazu führt, dass er als "nicht auf Lager" angezeigt wird. Vergleichen Sie die anderen Quantity Werte in unserer stock Tabelle mit der Stock Level, um sicherzustellen, dass Sie verstehen, wie unsere CASE Anweisungen funktionieren.

Stellen Sie sich vor, wie nützlich dieser Bericht wäre, wenn es Hunderte von Artikeln gäbe. Ein solcher Bericht könnte täglich an die Einkaufsleiter gesendet werden, damit sie die Lagerbestände beliebter Artikel aufrechterhalten können.

CASE mit NULL-Werten

Bei der Verwendung von CASE können Sie unerwünschte NULL-Werte in Ihrer Ergebnismenge feststellen. Warum erscheinen diese Werte und welche Maßnahmen können Sie ergreifen, um sie zu entfernen? NULL-Werte erscheinen, wenn ein Wert mit keiner der von Ihnen deklarierten Anweisungen CASE oder ELSE übereinstimmt. Schauen wir uns ein praktisches Beispiel an, das zeigt, wie NULL zurückgegeben werden kann.

Stellen Sie sich vor, wir würden die Anweisung ELSE aus unserem vorherigen Beispiel ausschließen. Wie würde sich das auf unsere Ergebnisse auswirken? Schauen wir uns die vorherige Abfrage an, diesmal ohne die Anweisung ELSE:

SELECT Item,
      CASE WHEN Quantity > 0 AND Quantity <= 20 THEN 'Low'
            WHEN Quantity > 20 AND Quantity <= 50 THEN 'Medium'
            WHEN Quantity > 50 THEN 'High'
		END AS 'Stock Level'
  	FROM stock

Die Ergebnisse sähen wie folgt aus. Achten Sie besonders auf den Lagerbestand für Zucker:

ItemStock Level
BreadMedium
MilkLow
CoffeeHigh
SugarNULL
EggsHigh
ApplesLow

Ohne ELSE, um die Situation zu behandeln, dass Quantity Null ist, gibt unsere Abfrage ein NULL zurück.

Wenn Sie einen unerwünschten NULL-Wert in Ihren CASE WHEN Ergebnissen haben, kann es sein, dass Sie ein Szenario haben, das von Ihren CASE WHEN und ELSE Bedingungen nicht abgedeckt wird.

GROUP BY mit CASE

Wie bereits erwähnt, können Sie den SQL-Ausdruck CASE mit GROUP BY verwenden. Schauen wir uns ein praktisches Beispiel dafür an.

Stellen Sie sich vor, Sie möchten Artikel auf der Grundlage ihres Preises gruppieren und dabei auch den Mindest- und Höchstpreis für die Gruppen mit niedrigem und hohem Preis anzeigen. Dies erfordert die Verwendung der Aggregatfunktionen MIN() und MAX(). Die Anweisung GROUP BY wird häufig verwendet, um Ergebnisdaten nach einer oder mehreren Spalten zu gruppieren, und oft speziell mit Aggregatfunktionen. Hier finden Sie ein Beispiel für die Verwendung von GROUP BY zusammen mit Aggregatfunktionen, das Sie für weitere Informationen lesen können. Lassen Sie uns die folgende SQL-Abfrage aufschlüsseln, um zu zeigen, wie die gewünschte Ergebnismenge erreicht werden kann:

SELECT
CASE WHEN Price >= 2.00 THEN 'High Price Item'
WHEN Price > 0 AND Price < 2.00 THEN 'Low Price Item'
END AS PriceLevel,
Min(Price) as MinimumPrice,
Max(Price) as MaximumPrice

FROM stock
GROUP BY
CASE WHEN Price >= 2.00 THEN 'High Price Item'
WHEN Price > 0 AND Price < 2.00 THEN 'Low Price Item'

END

Analysieren wir zunächst die Anweisung CASE. Sie ist ähnlich wie im vorherigen Beispiel.

CASE WHEN Price >= 2.00 THEN 'High Price Item'
WHEN Price > 0 AND Price < 2.00 THEN 'Low Price Item'
END AS PriceLevel

Wenn Price größer oder gleich 2,00 ist, wird der Artikel als hochpreisiger Artikel eingestuft. Wenn Price größer als 0, aber kleiner als 2,00 ist, handelt es sich um einen Niedrigpreisartikel. Diese String-Werte werden dann in der Spalte PriceLevel gespeichert und angezeigt, wie durch den Alias END AS angegeben.

Wir verwenden die Aggregatfunktionen MIN() und MAX() für unsere Spalte Price. So erhalten wir die niedrigsten und höchsten Price der Elemente in unserer Tabelle.

Wir verwenden unsere GROUP BY Klausel, um diese Aggregatfunktionen auf unsere zwei Kategorien von hohen und niedrigen Preisniveaus anzuwenden. (Machen Sie sich keine Sorgen, wenn Ihnen das kompliziert vorkommt; die Beherrschung von GROUP BY erfordert viel Übung. In unserem SQL-Praxis Track finden Sie interaktive Übungen, mit denen Sie Ihre GROUP BY-Technik und andere SQL-Kenntnisse verbessern können).

Die Ausführung dieser SQL-Abfrage liefert die folgende Ergebnismenge:

PriceLevelMinimumPriceMaximumPrice
High Price Item2.003.29
Low Price Item0.791.99

Das sind genau die Ergebnisse, die wir wollten! Wir können nun den Mindest- und Höchstpreis für jede der in unserer SQL-Anweisung CASE WHEN definierten Artikelkategorien klar erkennen. Sehen Sie sich unsere stock Tabelle und notieren Sie, welche einzelnen Artikel mit den für MinimumPrice und MaximumPrice angezeigten Werten verknüpft sind. Wenn wir unserer Tabelle einen neuen Artikel hinzufügen würden, der stock Tabelle einen neuen Artikel hinzufügen, der 4,00 $ kostet, würde die MaximumPrice des "Hochpreisartikels" auf 4,00 steigen.

SQL CASE und wiederverwendbare, komplexe Abfragen

Mit SQL CASE können Sie komplexe Abfragen schreiben, die eine Reihe von Aktionen ausführen. Wir haben Ihnen gerade gezeigt, wie Sie CASE WHEN mit SELECT verwenden können. Wie in diesem Artikel über die Verwendung von CASE mit datenverändernden Anweisungen gezeigt, kann CASE WHEN auch mit INSERT, UPDATE und DELETE verwendet werden. Dies führt zu sehr wiederverwendbaren Abfragen, die für Berichte oder Anwendungen implementiert werden können. Wenn Sie lernen möchten, wie man hochwertige benutzerdefinierte Berichte erstellt, empfehle ich Ihnen den umfassenden Kurs zur Erstellung von SQL-Berichten auf LearnSQL.de.