Zurück zur Artikelliste Artikel
10 Leseminuten

Verwendung von CASE zum Hinzufügen von Logik zu einer SELECT-Anweisung

Wenn Sie eine SQL-Abfrage schreiben, müssen Sie möglicherweise Werte aus mehreren Spalten abrufen und Werte von einer Form in eine andere ändern. Eine einfache Möglichkeit, dieses Ziel zu erreichen, ist das Hinzufügen eines CASE Ausdrucks zu Ihrer SELECT Anweisung. In diesem Artikel werden Sie mit der Syntax, den Formaten und der Verwendung des CASE Ausdrucks vertraut gemacht.

Der CASE Ausdruck ist ein bedingter Ausdruck: Er wertet Daten aus und gibt ein Ergebnis zurück. Das zurückgegebene Ergebnis hängt davon ab, ob die Daten bestimmte Kriterien erfüllen. Dieser Ausdruck kann in den Anweisungen SELECT, UPDATE und DELETE oder in den Klauseln WHERE, IN, LIKE, ORDER BY und HAVING verwendet werden. Wir werden uns auf die Anweisung SELECT konzentrieren und die Operatoren IN und LIKE verwenden.

Sie sollten wissen, dass es zwei Arten von CASE Ausdrücken gibt: einfache und gesuchte. Wir werden uns beide ansehen, aber zunächst werden wir mit der grundlegenden Syntax dieses Ausdrucks beginnen.

CASE-Syntax

Die grundlegende Syntax des Ausdrucks CASE wird im Folgenden dargestellt:

CASE   [ column or expression ]
	WHEN  value or condition THEN when_result
	...
	ELSE else_result
END

Der Ausdruck beginnt mit dem Schlüsselwort CASE und endet mit dem Schlüsselwort END. Die Namen bestimmter Spalten oder Ausdrücke werden nach dem Schlüsselwort CASE eingegeben. Die Schlüsselwörter WHEN und THEN definieren die logischen Bedingungen. Nach der WHEN -Klausel steht die Bedingung oder der zu vergleichende Wert; das THEN bestimmt das Ergebnis, wenn die Bedingung erfüllt ist. Eine optionale Anweisung ELSE bestimmt das Ergebnis, das zurückgegeben wird, wenn die Bedingung WHEN nicht erfüllt ist. Wenn ELSE nicht definiert ist und WHEN nicht erfüllt ist, wird NULL zurückgegeben.

Es gibt zwei Arten von CASE Ausdrücken: einfache und gesuchte. Beide haben eine etwas andere Syntax und funktionieren auch etwas anders.

Wir beginnen mit dem einfachen Format.

CASE: Das einfache Format

Das einfache CASE vergleicht einen Wert mit einer oder mehreren WHEN Bedingungen. Wenn er eine WHEN Bedingung erfüllt, wird das THEN Ergebnis zurückgegeben. Die Syntax sieht folgendermaßen aus:

CASE column_or_expression
    WHEN  value THEN when_result
    ...
    ELSE else_result
END

In einem einfachen CASE Ausdruck ist der Name der Spalte oder des Ausdrucks, der ausgewertet werden soll, unbedingt erforderlich. Er steht nach dem Schlüsselwort CASE. Der eingestellte Wert steht nach dem WHEN. Wenn der ausgewertete Wert gleich dem eingestellten Wert ist, wird das in THEN definierte Ergebnis zurückgegeben. Wenn der Wert aus der Spalte oder dem Ausdruck mit keinem der Werte von WHEN übereinstimmt, wird das Ergebnis von ELSE angezeigt. Denken Sie daran, dass ELSE optional ist.

Die folgenden Beispielabfragen basieren auf Daten aus der Tabelle animal Tabelle, wie unten gezeigt:

id name weight country number_of_animal zoo
1 Tiger 120 Russia 3 1
2 African elephant 4 800 Congo 5 1
3 Lion 175 Turkey 1 1
4 Koala 9 Australia 2 NULL
5 Giraffe 800 5 2
6 Gaur NULL China 2 1
7 Okapi 225 NULL 5 0

Sehen Sie sich diese einfache CASE an:

CASE  zoo 
  WHEN 1 THEN 'Brookfield Zoo'
  WHEN 2 THEN 'Dublin zoo'
  ELSE 'unknown'
END 

Dieses Beispiel wählt Daten aus der Tabelle animal Tabelle aus und zeigt den Namen des aktuellen Zoos des Tieres an. Wenn zoo=1, dann wird Brookfield Zoo angezeigt; wenn zoo=2, dann wird Dublin Zoo angezeigt; alle anderen Fälle werden als unknown angezeigt.

Das Ergebnis ist:

name zoo case
Tiger 1 Brookfield Zoo
African elephant 1 Brookfield Zoo
Lion 1 Brookfield Zoo
Koala NULL unknown
Giraffe 2 Dublin zoo
Gaur 1 Brookfield Zoo
Okapi 0 unknown

Beachten Sie, dass das Ergebnis unknown lautet, wenn der Wert aus der Zoospalte nicht mit einem der Werte in den WHEN -Klauseln übereinstimmt (oder NULL ist).

Bis jetzt haben wir einfache CASE Ausdrücke betrachtet, die einen Spaltennamen nach dem CASE Schlüsselwort haben. Sie können auch einen Ausdruck nach dem Schlüsselwort CASE einfügen.

Stellen Sie sich vor, dass Sie neben dem Gewicht der Tiere in Kilogramm auch das Gesamtgewicht der Säugetiere nach Arten anzeigen möchten - aber nur, wenn diese Werte speziell sind. In diesem Fall müssen drei Kennziffern ermittelt werden. Sie werden als Zeichenketten angezeigt. Ist das Gesamtgewicht nicht eine dieser drei Zahlen, dann werden andere angezeigt.

Hier ist die Abfrage:

SELECT name, weight, number_of_animal,
		( CASE  number_of_animal*weight 
  			WHEN 18 THEN 'small'
  			WHEN 360 THEN 'middle'
  			WHEN 24000 THEN 'big'
  			ELSE 'other'
		  END 
                 ) as total_weight
FROM  animal ;

Sehen Sie sich das Ergebnis an:

name weight number_of_animal total_weight
Tiger 120 3 middle
African elephant 4 800 5 big
Lion 175 1 other
Koala 9 2 small
Giraffe 800 5 other
Gaur NULL 2 other
Okapi 225 5 other

Dieser CASE Ausdruck hat eine ELSE Klausel, die andere anzeigt. Ohne die ELSE würde für alle nicht übereinstimmenden Gewichte NULL angezeigt. Hier ist derselbe Code ohne ELSE:

SELECT  name, weight, number_of_animal,
			 CASE  number_of_animal*weight 
  				WHEN 18 THEN 'small'
  				WHEN 360 THEN 'middle'
  				WHEN 24000 THEN 'big'
			 END 
                         as total_weight
FROM  animal ;

Und die Ergebnisse:

name weight number_of_animal total_weight
Tiger 120 3 middle
African elephant 4 800 5 big
Lion 175 1 NULL
Koala 9 2 small
Giraffe 800 5 NULL
Gaur NULL 2 NULL
Okapi 225 5 NULL

Verwendung von Aliasen in CASE-Anweisungen

Der Ausdruck CASE kann einen Alias oder einen Namen für die resultierende neue Spalte haben. Die obige Abfrage sieht jetzt mit einem Alias wie folgt aus:

SELECT name, zoo, 
			  CASE  zoo 
  			     WHEN 1 THEN 'Brookfield Zoo'
  			     WHEN 2 THEN 'Dublin zoo'
  			     ELSE 'unknown'
			   END 
			  as name_zoo
FROM  animal ;

Und das Ergebnis:

name zoo name_zoo
Tiger 1 Brookfield Zoo
African elephant 1 Brookfield Zoo
Lion 1 Brookfield Zoo
Koala NULL unknown
Giraffe 2 Dublin zoo
Gaur 1 Brookfield Zoo
Okapi 0 unknown

Verwendung von CASE mit anderen Datentypen

Sie können den Ausdruck CASE auch mit anderen Datentypen verwenden, z. B. mit CHARACTER.

Sehen Sie sich diese Abfrage an:

SELECT  name, zoo, 
			   ( CASE  country 
 			 	WHEN 'Russia' THEN 'Europe'
  				WHEN 'Congo' THEN 'Africa'
 				WHEN 'Turkey' THEN 'Asia'
  				WHEN 'Australia' THEN 'Australia' 
  				WHEN 'China' THEN 'Asia'
  				ELSE 'unknown'
				END 
                            ) as continent
FROM  animal ;

Diese Abfrage wählt Daten aus der Tabelle aus und zeigt den Kontinent an, aus dem das Tier stammt. Der Kontinent basiert auf der Spalte country, die den Datentyp CHARACTER verwendet.

Dies ist das Ergebnis:

name zoo continent
Tiger 1 Europe
African elephant 1 Africa
Lion 1 Asia
Koala NULL Australia
Giraffe 2 unknown
Gaur 1 Asia
Okapi 0 unknown

Der gesuchte CASE-Ausdruck

Der gesuchte CASE Ausdruck ist das am häufigsten verwendete Format. Aber anstatt eine Spalte oder einen Ausdruck mit einer definierten Menge von Werten zu vergleichen, kann ein gesuchter Ausdruck mehrere WHEN Bedingungen vergleichen und ein Ergebnis ermitteln. Dies macht einen gesuchten CASE zur besseren Wahl für kompliziertere Logik.

Hier ist die Syntax:

CASE 
    WHEN  conditions THEN when_result
    ...
    ELSE else_result
END

Auch hier beginnt der Ausdruck mit dem Schlüsselwort CASE, aber es folgt kein Spaltenname oder Ausdruck. Es kann mehrere WHEN - THEN Konstruktionen geben, genau wie bei der einfachen CASE. Aber nach dem Schlüsselwort WHEN geben wir eine oder mehrere Bedingungen ein, anstatt Werte festzulegen. Diese Bedingungen vergleichen einen abgerufenen Wert und geben die erste Bedingung, die er erfüllt, als TRUE zurück. Daraufhin wird das Ergebnis von THEN angezeigt. Wenn alle Bedingungen FALSE ergeben, wird das Ergebnis von ELSE angezeigt. Und auch hier gilt: ELSE ist optional.

Dies mag schwer zu verstehen sein, also lassen Sie uns unsere Beispielabfrage genauer betrachten:

SELECT  name, weight,
		  CASE 
  		    WHEN weight>1000 THEN 'big'
  		    WHEN weight BETWEEN 100  AND 1000 THEN 'middle'
		    WHEN weight<100 THEN 'small'
	            ELSE '---'
		  END 
		  as description_weight
FROM  animal ;

Sehen Sie sich die Ergebnisse an:

name weight description_weight
Tiger 120 middle
African elephant 4 800 big
Lion 175 middle
Koala 9 small
Giraffe 800 middle
Gaur NULL
Okapi 225 middle

Die erste WHEN-Klausel prüft, ob weight größer als 1.000 Kilogramm ist. Wenn dies der Fall ist, wird die Zeichenfolge big zurückgegeben. Die nächste Bedingung WHEN prüft, ob weight zwischen 100 und 1.000 Kilogramm liegt. Ist dies der Fall, wird die Zeichenfolge middle zurückgegeben. In diesem Fall wird der BETWEEN AND Operator verwendet, um den Bereich zu definieren. Für Tiere, deren weight weniger als 100 Kilogramm wiegt, wird die Zeichenfolge small angezeigt. In allen anderen Fällen ist der Rückgabewert "- ".

Verwendung von CASE mit LIKE

Sie können andere Operatoren mit dem Ausdruck CASE verwenden. Im folgenden Beispiel wird der Operator LIKE verwendet, der mit Mustern in Suchteilzeichenketten übereinstimmt. (Weitere Informationen über den Operator LIKE finden Sie unter Verwendung von LIKE zum Abgleichen von Mustern in SQL).

Hier ist das Beispiel:

SELECT name, 
		( CASE 
  			WHEN name LIKE '____' THEN '4 letters'
  			WHEN name LIKE '_____' THEN '5 letters'
 			ELSE 'other'
		  END 
		) as description
FROM  animal ;

Und hier ist das Ergebnis:

name description
Tiger 5 letters
African elephant other
Lion 4 letters
Koala 5 letters
Giraffe other
Gaur 4 letters
Okapi 5 letters

In diesem gesuchten Ausdruck CASE prüft der Operator LIKE, ob der Name des Tieres aus vier oder fünf Buchstaben besteht. In anderen Fällen - wie bei dem afrikanischen Elefanten - ist der Rückgabewert anders.

Verwendung von CASE mit IN

Im nächsten Beispiel werden wir den Operator IN ausprobieren. Erinnern Sie sich an den einfachen Ausdruck CASE, der den Namen eines Kontinents auf der Grundlage des mit einem Tier verbundenen Landes zurückgab? Der Code für diese Abfrage war lang, dank der vielen separaten WHEN - THEN Konstruktionen. Im Folgenden werfen wir noch einmal einen Blick auf den alten Code:

SELECT  name, country,
			( CASE  country 
  				WHEN 'Russia' THEN 'Europe'
  				WHEN 'Congo' THEN 'Africa'
  				WHEN 'Turkey' THEN 'Asia'
 				WHEN 'Australia' THEN 'Australia' 
  				WHEN 'China' THEN 'Asia'
  				ELSE 'unknown'
			  END 
                         ) as continent
FROM  animal ;

Mit dem Operator IN können Sie die Menge des Codes reduzieren. Sehen Sie sich eine Suche nach CASE mit dem IN Operator an:

SELECT name, country, 
		( CASE   
 		    WHEN country IN ('Russia') THEN 'Europe'
 		    WHEN country IN ('Congo') THEN 'Africa'
		    WHEN country IN ('Turkey','China') THEN 'Asia'
 		    WHEN country IN ('Australia') THEN 'Australia' 
	            ELSE 'unknown'
		  END 
		) as continent
FROM  animal ;

Wir können den Operator IN verwenden, um mehrere Länder desselben Kontinents aufzulisten. Wenn der Wert aus der Spalte country mit einer der Zeichenketten in IN übereinstimmt, ist das Ergebnis der Kontinent aus der Klausel THEN. Wenn der Ländername in keinem der IN -Operatoren aufgeführt ist, greift natürlich ELSE ein und gibt einen unknown -Wert zurück.

Sehen Sie sich die Ergebnistabelle unten an:

name country continent
Tiger Russia Europe
African elephant Congo Africa
Lion Turkey Asia
Koala Australia Australia
Giraffe unknown
Gaur China Asia
Okapi NULL unknown

Anordnen von Bedingungen in CASE

Jetzt können Sie also Bedingungen in die WHEN Klausel einbauen. Es ist jedoch wichtig, sie genau zu formulieren. Wenn Ihr Testwert mit der ersten WHEN-Klausel übereinstimmt, wird die THEN -Klausel zurückgegeben und der CASE-Ausdruck ist beendet. Auch wenn ein Wert tatsächlich mehrere WHEN Bedingungen erfüllt, wird nur die erste Bedingung zurückgegeben.

Sehen Sie sich das folgende Beispiel an:

SELECT name, weight,
				( CASE 
  					WHEN weight<1000 THEN 'not big'
  					WHEN weight<100 THEN 'not middle'
  					WHEN weight<10 THEN 'very small'
 					ELSE '---'
			  	  END 
				) as description_weight
FROM  animal ;

In diesem Fall ist der Wert weight der erste, der die erste Bedingung WHEN erfüllt. In unserer Tabelle werden die meisten Tiere einen weight Wert von weniger als 1.000 kg haben. Nur bei Tieren mit einem zugehörigen weight von 1.000 oder mehr (oder mit einem NULL-Wert in weight) wird ein "-"-Wert zurückgegeben.

Hier sind die Ergebnisse:

name weight description_weight
Tiger 120 not big
African elephant 4 800
Lion 175 not big
Koala 9 not big
Giraffe 800 not big
Gaur NULL
Okapi 225 not big

Denken Sie daran, dass die Reihenfolge der WHEN-Bedingungen sehr wichtig ist; sie können die Ergebnisse beeinflussen, die Sie zurückerhalten.

Mehr über den SQL CASE-Ausdruck lernen

Die Fähigkeit, einen richtig formatierten CASE Ausdruck zu verwenden, ist eine gute Fähigkeit, die es zu pflegen gilt. So können Sie die Ergebnisse erzielen, die Sie von Ihren Abfragen erwarten.

Wenn Sie mehr über den Ausdruck CASE erfahren möchten, besuchen Sie den LearnSQL Standard-SQL-Funktionen Kurs. Er zeigt Ihnen, wie Sie Abfragen erstellen können, die diesen und viele andere Ausdrücke verwenden. Sie erhalten auch die Möglichkeit, Ihre Fähigkeiten zu üben. Probieren Sie es noch heute aus!