Zurück zur Artikelliste Artikel
10 Leseminuten

Wie man CASE in SQL verwendet

Wenn Sie mehrere bedingte Anweisungen auswerten müssen, ist die SQL-Anweisung CASE genau das Richtige für Sie. Hier erfahren Sie, was Sie wissen müssen, um CASE wie ein Profi zu verwenden.

Warum ist CASE in SQL so wichtig? Wenn Sie Daten analysieren oder manipulieren, möchten Sie oft Regeln auf der Grundlage bestimmter Bedingungen festlegen, z. B. wenn die Leistung eines Mitarbeiters überdurchschnittlich ist, erhalten Sie eine 10 %ige Gehaltserhöhung; wenn sie hervorragend ist, erhalten Sie eine 15 %ige Gehaltserhöhung; andernfalls erhalten Sie eine 5 %ige Gehaltserhöhung.

Um Situationen zu bewältigen, in denen Sie viele bedingte Anweisungen zusammen auswerten und Ergebnisse zurückgeben müssen, je nachdem, welche Anweisung wahr ist, bietet SQL die Anweisung CASE.

Die SQL-Anweisung CASE ist eines der nützlichsten bedingten Konstrukte, die es gibt, und hat viele Anwendungsmöglichkeiten für die Datenanalyse mit SQL.

Wenn Sie also etwas über die praktischen Anwendungen der Anweisung CASE und die verschiedenen Möglichkeiten, sie zu verwenden, erfahren möchten, ist dieser Artikel genau das Richtige für Sie.

Was ist die CASE-Anweisung?

In SQL gibt die Anweisung CASE Ergebnisse auf der Grundlage der Auswertung bestimmter Bedingungen zurück. Sie ist recht vielseitig und kann in verschiedenen Konstrukten verwendet werden. Sie können sie beispielsweise verwenden, um Werte anzuzeigen, Sortierergebnisse zu ordnen oder Datensätze zu filtern. Sie wertet die angegebenen Bedingungen aus und gibt das Ergebnis für die erste Anweisung zurück, die als wahr bewertet wird.

Bevor ich näher auf die Funktionsweise von CASE eingehe, werfen Sie einen Blick auf die Syntax der Anweisung CASE:

CASE
WHEN <condition> THEN <value>,
WHEN <other condition> THEN <value>
ELSE <value>
END AS <column name>

Schauen wir uns ein praktisches Beispiel für eine einfache CASE -Anweisung an.

Hier ist die order_summary Tabelle:

order_idcustomer_idcustomer_namequantityorder_valueshipping_fee
A1231221Emily52059
A1243213Javier223000
A1253213Javier12320000
A1263213Javier1016000

Nehmen wir an, Sie sind ein Analyst in einem E-Commerce-Unternehmen. Sie möchten die Bestellungen auf der Grundlage ihres Bestellwerts analysieren und sie entsprechend ihres Bestellwerts in Bereiche(sehr niedrig, niedrig, mittel, hoch und sehr hoch) einteilen.

Mit der Anweisung CASE können Sie dies erreichen. Hier ist die Abfrage, die Sie schreiben würden:

SELECT  order_id,
	  CASE 
	  WHEN order_value <= 50 THEN 'Very Low'
  WHEN order_value > 50 AND order_value <= 200 THEN 'Low'
  WHEN order_value > 200 AND order_value <= 500 THEN 'Medium'
  WHEN order_value > 500 AND order_value <= 1000 THEN 'High'
  ELSE 'Very High' 
  END AS order_category
FROM    order_summary;

Und hier sind die Ergebnisse, die Sie erhalten würden:

order_idorder_category
A123Medium
A124Medium
A125Very High
A126High

Alternativ dazu können Sie auch die unten stehende Abfrage verwenden:

SELECT order_id,
 CASE
 WHEN order_value <= 50 THEN 'Very Low'
 WHEN order_value <= 200 THEN 'Low'
 WHEN order_value <= 500 THEN 'Medium'
 WHEN order_value <= 1000 THEN 'High'
 ELSE 'Very High'
END AS order_category
FROM order_summary;

Damit erhalten Sie genau das gleiche Ergebnis, da CASE die Auswertung eines Wertes beendet, sobald er die Kriterien in WHEN erfüllt.

Lassen Sie mich nun diese Abfragen aufschlüsseln.

Das erste Schlüsselwort ist SELECT, das die Spalten angibt, die Sie zurückgeben möchten. In unserem Fall waren dies die Spalten order_id und order_category, die wir als Alias für die Anweisung CASE (CASE...END AS order_category) verwendet haben.

Die Anweisung CASE beginnt mit dem Schlüsselwort CASE. Es folgt das Schlüsselwort WHEN, nach dem wir eine Bedingung angeben, die ausgewertet werden soll (order_value <= 50). Unmittelbar danach folgen THEN und der Rückgabewert, wenn die Bedingung erfüllt ist (‘Very Low’).

Nehmen wir zum Beispiel die erste Anweisung:

CASE WHEN order_value <= 50 THEN 'Very Low'

In dieser Anweisung wird, wenn der Bestellwert kleiner oder gleich 50 $ ist, "Very Low" als Wert in der Spalte order_category zurückgegeben. Mit anderen Worten: Wir ordnen alle Bestellungen mit einem Wert von weniger als 50 $ oder gleich 50 $ der Kategorie "Sehr niedrig" zu.

Wenn diese Bedingung nicht erfüllt ist (der Wert liegt über 50 $), prüft die Abfrage, ob der Wert über 200 $ liegt. Liegt der Wert unter 200 $, aber über 50 $, dann wird "Niedrig" als Wert in der Spalte order_category zurückgegeben. Wenn der Wert über 200 $ liegt, springt die Abfrage zur nächsten WHEN Klausel usw.

Wenn keine der Bedingungen als wahr ausgewertet wird, wird der in ELSE angegebene Wert zurückgegeben. Die Anweisung CASE fügt also Ihrer SELECT-Anweisung Logik hinzu.

Wenn Sie neu in SQL sind und verstehen wollen, wie man diese Art von Abfragen schreibt, empfehle ich Ihnen den SQL von A bis Z Track von LearnSQL.de. Er beginnt mit den Grundlagen von SQL und Datenbanken und führt Sie dann bis hin zu anspruchsvolleren Abfragen und Funktionen. Das ist ein guter Weg, um mit SQL zu beginnen.

Wenn Sie viele Bestellungen analysieren, ist die Aggregation bei Abfragen wie diesen sehr nützlich. Aggregation bedeutet, ähnliche Datensätze zu gruppieren und dann eine auf den gruppierten Werten basierende Metrik zu verwenden, um die Merkmale dieser Gruppe zu verstehen. In SQL ist die GROUP BY Klausel Ihr Einstieg in die Welt der Aggregatstatistiken. (Ein ausführlicheres Verständnis von GROUP BY finden Sie in diesem Artikel).

Schauen wir uns erst einmal an, wie GROUP BY und CASE zusammenarbeiten. Hier ist eine aktualisierte Version unserer vorherigen Abfrage:

SELECT  CASE 
	  WHEN order_value <= 50 THEN 'Very Low'
  WHEN order_value > 50 AND order_value <= 200 THEN 'Low'
  WHEN order_value > 200 AND order_value <= 500 THEN 'Medium'
  WHEN order_value > 500 AND order_value <= 1000 THEN 'High'
  ELSE 'Very High' 
  END AS order_category,
  COUNT(order_id)
FROM    order_summary
GROUP BY 1;

Und die neue Ausgabe:

order_categoryCOUNT(order_id)
High1
Medium2
Very High1

Hier verwenden wir COUNT als Aggregatfunktion. So funktioniert es. Die Klausel GROUP BY aggregiert alle Datensätze nach den Werten, die in der ersten Spalte von SELECT zurückgegeben werden. In unserem Fall ist dies order_category.

Dann berechnet COUNT(order_id) für jeden unterschiedlichen Wert von order_category die Gesamtzahl der Bestellungen, die zu der entsprechenden Kategorie gehören. Die Anweisung CASE hilft bei der Entscheidung, welcher Kategorie die einzelnen Bestellungen zugeordnet werden sollen. In unseren Daten haben wir insgesamt 1 Bestellung in der Kategorie "Hoch" (order_value zwischen 500 und 1000), 2 Bestellungen in der Kategorie "Mittel" (order_value zwischen 200 und 500) und 1 Bestellung in der Kategorie "Sehr hoch" (order_value größer als 1000).

In allen obigen Beispielen wurde die Anweisung CASE im SELECT Teil der Abfrage verwendet. Diese Klausel ist jedoch recht vielseitig und kann für die Rückgabe von bedingungsbasierten Ergebnissen in anderen Teilen der Abfrage verwendet werden.

Nachdem Sie nun eine Vorstellung davon haben, was die CASE-Anweisung ist, sehen wir uns nun einige andere Möglichkeiten an, sie zu verwenden.

Verwendung von CASE in der ORDER BY-Klausel

Die ORDER BY-Klausel wird verwendet, um Abfrageergebnisse in einer bestimmten Reihenfolge zu sortieren. Sie könnten zum Beispiel die Anzahl der Bestellungen jedes Kunden auf der Grundlage von customer_name sortieren wollen. Hier ist die Abfrage, die Sie schreiben würden:

SELECT   customer_name,
   COUNT(order_id)
FROM 	   order_summary
GROUP BY customer_name
ORDER BY customer_name;

Und die Ausgabe ist:

customer_nameCOUNT(order_id)
Emily1
Javier3

Hier sortiert die Abfrage die Ergebnisse in aufsteigender alphabetischer Reihenfolge (weil Sie nach einem Textwert sortieren). Wenn Sie nichts anderes angeben, verwendet ORDER BY immer eine aufsteigende Reihenfolge (d. h. A-Z, 1-10). Sie können das Schlüsselwort DESC nach der Spaltennamensklausel einfügen, um die Ergebnisse in absteigender Reihenfolge (Z-A, 10-1) zu sortieren: ORDER BY customer_name DESC.

Angenommen, Sie möchten die Datensätze nach order_id in aufsteigender Reihenfolge sortieren. Sie möchten jedoch zuerst die Aufträge mit mehr als 120 Einträgen anzeigen. Mit anderen Worten, Sie sortieren zuerst nach der Artikelmenge (wenn die Menge größer als 120 ist) und dann nach der Bestell-ID. Dies erfordert eine bedingte Auswertung in der ORDER BY Klausel:

Query:
SELECT
  customer_name,
  order_id,
  order_value,
  quantity
FROM
  order_summary
ORDER BY
  CASE WHEN quantity > 120 THEN quantity END, order_id;

Hier ist die Ausgabe:

customer_nameorder_idorder_valuequantity
JavierA1252000123
EmilyA1232055
JavierA12430022
JavierA126600101

In dieser Abfrage erhalten wir zunächst die Spalten customer_name, order_id, order_value und Menge aus der Tabelle. Beim Ordnen der Zeilen holt diese Abfrage zuerst die Zeilen, bei denen die Menge größer als 120 ist. (In diesem Fall ist die Menge 123.) Da wir keine anderen Zeilen haben, die dieses Kriterium erfüllen, werden die restlichen Zeilen nach order_id geordnet.

Verwendung von CASE in der WHERE-Klausel

Die WHERE-Klausel wird verwendet, um Datensätze aus den Abfrageergebnissen auf der Grundlage von angegebenen Bedingungen zu filtern. Wenn Ihr Unternehmen z. B. die Versandkosten für Bestellungen über 100 $ erlassen möchte, möchten Sie vielleicht zuerst sehen, wie viele Bestellungen dafür in Frage kommen, und die Auswirkungen analysieren. Die folgende WHERE Klausel zählt nur IDs für Bestellungen über $100:

SELECT  COUNT(order_id)
FROM    order_summary
WHERE   order_value > 100;

Und das Ergebnis:

COUNT(order_id)
4

Anhand des Ergebnisses können Sie davon ausgehen, dass etwa 4 Bestellungen davon betroffen sein werden. Natürlich ist dies nur der erste Schritt Ihrer Analyse; Sie werden wahrscheinlich noch viele weitere detaillierte Analysen durchführen wollen, um die Auswirkungen zu quantifizieren.

Jetzt möchte ich Ihnen ein Beispiel für die Verwendung der WHERE Klausel mit CASE zeigen. Werfen Sie einen Blick auf die influencer_list Tabelle an:

influencer_nameinfluencer_channelyoutube_channelfb_channelmonth_yeartotal_views
LouisyoutubehungryLouisJan_20213200
JanetfacebookstylenmakeupJan_2021423444
MichaelfacebookInfl_brandXJan_20212322
MichaelfacebookInfl_brandXFeb_2021240000

Nehmen wir an, Ihr Unternehmen nutzt verschiedene Influencer, um Ihre Marken zu bewerben. Sie möchten alle Influencer sehen, deren YouTube-Kanal oder Facebook-Konto direkt Ihren Namen ("BrandX") verwendet.

Jeder Influencer hat eine Art von Kanal/Account. So finden Sie heraus, welche davon BrandX erwähnen:

SELECT DISTINCT influencer_name
FROM influencer_list
WHERE CASE WHEN influencer_channel = 'facebook' THEN fb_channel
	     WHEN influencer_channel = 'youtube' THEN youtube_channel
	     END LIKE '%brandX%';

Hier ist das Ergebnis:

influencer_name
Michael

Die obige Abfrage gibt alle Zeilen zurück, in denen entweder youtube_channel oder fb_channel ‘brandX’ vorkommt. Wie machen wir das? Nun, Sie wissen, wie WHERE und CASE WHEN zusammenarbeiten. Das neue Element hier ist LIKE '%brandX%'. Damit wird der Abfrage lediglich mitgeteilt, dass sie die Influencer-Kanäle zurückgeben soll, die "BrandX" in ihrem Namen enthalten. LIKE wird verwendet, um den Spaltenwert mit dem Muster abzugleichen, und das Prozentzeichen (%) zeigt an, dass eine beliebige Anzahl von Zeichen vor oder nach "BrandX" stehen kann (deshalb steht das % an beiden Enden von BrandX).

Verwendung von CASE in der HAVING-Klausel

Die HAVING-Klausel wird mit der GROUP BY -Klausel verwendet, um die angezeigten Gruppen zu filtern. Wenn Sie zum Beispiel Datensätze aus der Tabelle influencer_list sehen möchten, bei denen total_views während der Lebensdauer des Influencers größer als eine Million ist, würden Sie schreiben:

SELECT      influencer_name,
	   SUM(total_views)
FROM     influencer_list
GROUP BY influencer_name
HAVING   SUM(total_views) > 200000;

Und das ist das Ergebnis:

influencer_nameSUM(total_views)
Michael242322
Janet423444

Sie können auch CASE mit der Klausel HAVING verwenden. Angenommen, Sie möchten eine Liste von Influencern erhalten, deren Gesamtaufrufe größer als 100 für YouTube oder größer als 400.000 für Facebook sind.

SELECT      influencer_name,
	   influencer_channel,
	   SUM(total_views)
FROM     influencer_list
GROUP BY influencer_name,
	   influencer_channel
HAVING   CASE WHEN influencer_channel = 'youtube' 
        THEN SUM(total_views) > 100
  WHEN influencer_channel = 'facebook' 
  THEN SUM(total_views) > 400000
   END;

Und das Ergebnis:

influencer_nameinfluencer_channelSUM(total_views)
Louisyoutube3200
Janetfacebook423444

Diese Abfrage summiert zunächst die Gesamtaufrufe nach influencer_name und influencer_channel. In der Klausel HAVING filtern wir dann nur die Gruppen, die mehr als 100 Aufrufe für YouTube und mehr als 400.000 Aufrufe für Facebook haben. Beachten Sie, dass Michael, der 242.322 Facebook-Aufrufe hat, nicht in der Ausgabe erscheint; seine Gesamtzahl liegt unter 400.000.

Verwendung von CASE in einer UPDATE-Anweisung

Sie können auch CASE in einer UPDATE-Anweisung verwenden. Die Anweisung SQL UPDATE wird verwendet, um Werte in einer bestehenden Tabelle zu ändern.

Stellen Sie sich vor, Sie möchten die Werte von influencer_channel in unserem aktuellen Datensatz aktualisieren, indem Sie die Kanäle in einen Code mit zwei Buchstaben ändern: "youtube" muss in "yt" und "facebook" in "fb" geändert werden.

UPDATE influencer_list
SET     influencer_channel = CASE influencer_channel 
 			  WHEN 'youtube' THEN 'yt'
			  WHEN 'facebook' THEN 'fb'
			  ELSE 'invalid value'
			  END;

So sieht die influencer_list Tabelle nach der Aktualisierung aussehen wird:

influencer_nameinfluencer_channelyoutube_channelfb_channelmonth_yeartotal_views
LouisythungryLouisJan_20213200
JanetfbstylenmakeupJan_2021423444
MichaelfbInfl_brandXJan_20212322
MichaelfbInfl_brandXFeb_2021240000

Sie werden feststellen, dass "youtube" durch "yt" und "facebook" durch "fb" in der Spalte "influencer_channel" ersetzt wurde.

Sie können auch CASE verwenden, um Zeilen in Ihren Tabellen zu löschen oder einzufügen. Lesen Sie diesen Artikel über die Verwendung von CASE mit datenverändernden Anweisungen für weitere Details.

Sind Sie bereit, CASE in SQL-Abfragen zu verwenden?

Nach all diesen Beispielen haben Sie sicher eine bessere Vorstellung von der Funktionsweise von CASE in SQL und von den verschiedenen Anwendungsmöglichkeiten der Anweisung. Es ist also an der Zeit, dass Sie das Gelernte in die Tat umsetzen! Die Lektüre von SQL hilft Ihnen sicherlich beim Lernen, aber wenn Sie ein Experte werden wollen, lautet Ihr Mantra "Üben!".

Ich würde auch einen guten SQL-Praxis kurs empfehlen. Der Praxiskurs LearnSQL.de arbeitet mit praktischen Beispielen und Anwendungsfällen, und Sie brauchen für den Anfang nichts einzurichten - das Internet und ein Browser reichen aus.

Je mehr Abfragen Sie schreiben, desto besser werden Sie mit CASE und anderen SQL-Befehlen umgehen können. Warum warten? Fangen Sie jetzt an!