In SQL Server das T-SQL CASE
expression ist ein skalarer Ausdruck, der einen Wert basierend auf bedingter Logik zurückgibt. Es wertet eine Liste von Bedingungen aus und gibt basierend auf dem Ergebnis dieser Bedingungen einen Wert zurück..
In gewisser Weise ist der SQL Server CASE
Ausdruck ähnelt IF...ELSE
. Jedoch CASE
ermöglicht es Ihnen, auf mehrere Bedingungen zu prüfen, wohingegen IF...ELSE
nicht.
Außerdem in SQL Server IF...ELSE
ist ein Schlüsselwort für die Ablaufsteuerung, während CASE
ist nicht. Der CASE
Ausdruck kann nicht verwendet werden, um den Ablauf der Ausführung von T-SQL-Anweisungen, Anweisungsblöcken, benutzerdefinierten Funktionen und gespeicherten Prozeduren zu steuern.
Die 2 Formen des CASE-Ausdrucks
Es gibt zwei Formen von CASE
Ausdruck in SQL Server:
- Einfacher
CASE
Ausdruck - Suchte
CASE
Ausdruck
Diese werden unten anhand von Beispielen erläutert.
Formular 1 – Der einfache CASE-Ausdruck
Der einfache CASE
Ausdruck vergleicht einen Ausdruck mit einer Menge einfacher Ausdrücke, um das Ergebnis zu bestimmen.
Hier ist ein einfaches Beispiel, um zu demonstrieren, wie ein CASE
Ausdruck funktioniert in SQL Server.
DECLARE @stock_ticker varchar(4) = 'V';
SELECT Company =
CASE @stock_ticker
WHEN 'AAPL' THEN 'Apple'
WHEN 'FB' THEN 'Facebook'
WHEN 'V' THEN 'Visa'
ELSE 'Not in the portfolio'
END
Ergebnis:
+-----------+| Firma ||-----------|| Visum |+-----------+
In diesem Beispiel mein CASE
Ausdruck ist Teil eines SELECT
Erklärung. Es prüft auf drei Bedingungen und hat ein ELSE
um für alles zu sorgen, was nicht in den drei Bedingungen abgedeckt ist.
In diesem Fall der Börsenticker V
stimmt mit dem dritten WHEN
überein Ausdruck und den von THEN
bereitgestellten Ausdruck zurückgegeben wird.
Um es klar zu sagen, der eigentliche CASE
Ausdruck ist dieser Teil:
CASE @stock_ticker
WHEN 'AAPL' THEN 'Apple'
WHEN 'FB' THEN 'Facebook'
WHEN 'MA' THEN 'Mastercard'
WHEN 'V' THEN 'Visa'
ELSE 'Not in the portfolio'
END
Welcher CASE
tut, es überprüft den Wert jedes WHEN
Ausdruck gegen den Eingabeausdruck. In meinem Beispiel der @stock_ticker
variable ist der Eingabeausdruck. Daher wird der Wert jedes WHEN
überprüft Ausdruck gegen @stock_ticker
Variable.
Wenn/falls es eine Übereinstimmung findet, gibt es den von THEN
bereitgestellten Ausdruck zurück .
Mein Beispiel verwendet drei WHEN
Ausdrücke, aber es hätte mehr und weniger sein können, je nach meinen Anforderungen.
Formular 2 – Der gesuchte CASE-Ausdruck
Der gesuchte CASE
expression wertet eine Reihe von booleschen Ausdrücken aus, um das Ergebnis zu bestimmen.
Hier ist ein Beispiel für einen gesuchten CASE
Ausdruck.
DECLARE @price int = 1500;
SELECT Affordability =
CASE
WHEN @price < 100 THEN 'Cheap'
WHEN @price >= 100 AND @price < 500 THEN 'Affordable'
ELSE 'Expensive'
END
Ergebnis:
+----------------+| Erschwinglichkeit ||-----------------|| Teuer |+----------------+
Ein gesuchter CASE
expression hat keinen Eingabeausdruck wie der einfache CASE
Ausdruck.
Daran erinnern Sie sich in unserem einfachen CASE
Ausdruck, es begann mit CASE
@stock_ticker
, und daher wussten wir, dass der WHEN
Ausdrücke wurden alle anhand des Werts von @stock_ticker
ausgewertet .
Mit dem gesuchten CASE
Ausdruck, wir geben am Anfang keinen Eingabeausdruck wie diesen. Stattdessen jedes WHEN
Ausdruck enthält einen booleschen Ausdruck, für den ausgewertet werden soll.
Ein Datenbankbeispiel
Hier ist ein Beispiel, das zeigt, wie der CASE
Ausdruck kann innerhalb einer Datenbankabfrage verwendet werden.
USE WideWorldImporters;
SELECT
CityName AS [City],
LatestRecordedPopulation AS [Population],
Size =
CASE
WHEN LatestRecordedPopulation < 2000000 THEN 'Small City'
WHEN LatestRecordedPopulation >= 2000000 AND LatestRecordedPopulation < 3000000 THEN 'Big City'
ELSE 'Really Big City'
END
FROM Application.Cities
WHERE LatestRecordedPopulation > 1000000;
Ergebnis:
+--------------+--------------+----------- -+| Stadt | Bevölkerung | Größe ||--------------+--------------+---------------- || Brooklyn | 2565635 | Großstadt || Chicago | 2695598 | Großstadt || Dallas | 1197816 | Kleine Stadt || Houston | 2099451 | Großstadt || Los Angeles | 3792621 | Wirklich große Stadt || Manhatten | 1619090 | Kleine Stadt || New York | 8175133 | Wirklich große Stadt || Philadelphia | 1526006 | Kleine Stadt || Phönix | 1445632 | Kleine Stadt || Königinnen | 2272771 | Großstadt || San Antonio | 1327407 | Kleine Stadt || San Diego | 1307402 | Kleine Stadt || Die Bronx | 1408473 | Kleinstadt |+--------------+-------------+----------- -+
Dieses Beispiel verwendet einen gesuchten CASE
Ausdruck, um die Ergebnisse von LatestRecordedPopulation
auszuwerten Spalte der Application.Cities
Tisch.
Datentypen
In SQL Server der Datentyp des Eingabeausdrucks und des WHEN
Ausdrücke müssen gleich oder eine implizite Konvertierung sein.
Folgendes passiert, wenn dies nicht der Fall ist:
DECLARE @stock_ticker varchar(4) = 'V';
SELECT Company =
CASE @stock_ticker
WHEN 1 THEN 'Apple'
WHEN 2 THEN 'Facebook'
WHEN 3 THEN 'Mastercard'
WHEN 4 THEN 'Visa'
ELSE 'Not in the portfolio'
END
Ergebnis:
Msg 245, Level 16, State 1, Line 3Conversion failed when converting the varchar value 'V' to data type int.
Reihenfolge der Bewertung
Der T-SQL-CASE
Ausdruck wertet seine Bedingungen sequentiell aus und stoppt bei der ersten Bedingung, deren Bedingung erfüllt ist.
Um dies zu demonstrieren, verwenden wir mehrere WHEN
Ausdrücke, die denselben Wert haben:
DECLARE @stock_ticker varchar(4) = 'V';
SELECT Company =
CASE @stock_ticker
WHEN 'V' THEN 'Visa 1'
WHEN 'V' THEN 'Visa 2'
WHEN 'V' THEN 'Visa 3'
ELSE 'Not in the portfolio'
END
Ergebnis:
+-----------+| Firma ||-----------|| Visum 1 |+-----------+
In diesem Fall wurde beim ersten WHEN
angehalten Ausdruck.
Es kann gelegentlich vorkommen, dass ein Ausdruck vor einem CASE
ausgewertet wird expression erhält die Ergebnisse des Ausdrucks als Eingabe. In solchen Szenarien könnte es zu einem Fehler kommen. Dies könnte passieren, wenn Sie einen Aggregatausdruck als WHEN
einfügen Ausdruck.
Aus diesem Grund empfiehlt Microsoft Folgendes:
Sie sollten sich nur auf die Reihenfolge der Auswertung der WHEN-Bedingungen für skalare Ausdrücke verlassen (einschließlich nicht korrelierter Unterabfragen, die Skalare zurückgeben), nicht für aggregierte Ausdrücke.
ELSE ist optional
Das ELSE
Argument ist optional. Daher könnten wir unser „Erschwinglichkeits“-Beispiel wie folgt umschreiben:
DECLARE @price int = 1500;
SELECT Affordability =
CASE
WHEN @price < 100 THEN 'Cheap'
WHEN @price >= 100 AND @price < 500 THEN 'Affordable'
WHEN @price >= 500 THEN 'Expensive'
END
Ergebnis:
+----------------+| Erschwinglichkeit ||-----------------|| Teuer |+----------------+
Beachten Sie jedoch, dass Sie am Ende NULL
erhalten könnten wenn Sie ELSE
weglassen Streit.
Das folgende Beispiel ergibt NULL
:
DECLARE @price int = 1500;
SELECT Affordability =
CASE
WHEN @price < 100 THEN 'Cheap'
WHEN @price >= 100 AND @price < 500 THEN 'Affordable'
WHEN @price >= 500 AND @price < 1000 THEN 'Expensive'
END
Ergebnis:
+----------------+| Erschwinglichkeit ||-----------------|| NULL |+----------------+
In solchen Fällen könnten wir immer ein ELSE
hinzufügen Argument, nur für den Fall (Entschuldigung für das Wortspiel!):
DECLARE @price int = 1500;
SELECT Affordability =
CASE
WHEN @price < 100 THEN 'Cheap'
WHEN @price >= 100 AND @price < 500 THEN 'Affordable'
WHEN @price >= 500 AND @price < 1000 THEN 'Expensive'
ELSE 'Unknown'
END
Ergebnis:
+----------------+| Erschwinglichkeit ||-----------------|| Unbekannt |+----------------+
Zugegeben, dieses Beispiel ist wohl etwas konstruiert. Schließlich muss „teuer“ nicht gekappt werden. Wenn etwas unter 1.000 $ teuer ist, dann ist es auch teuer, wenn es über 1.000 $ liegt.
Aber der Punkt ist, dass Sie ELSE
verwenden können um alles zu fangen, was nicht durch WHEN
abgedeckt ist Ausdruck/e.
Verschachtelte CASE-Ausdrücke
Sie können CASE
verschachteln Ausdrücke, falls erforderlich.
DECLARE @price int, @on_sale bit;
SET @price = 1500;
SET @on_sale = 1;
SELECT Affordability =
CASE
WHEN @price < 100 THEN 'Cheap'
WHEN @price >= 100 THEN
CASE @on_sale
WHEN 0 THEN 'Expensive (but it''s not currently on sale)'
WHEN 1 THEN 'Expensive (and it''s already on sale!)'
END
END
Ergebnis:
+--------------------------+| Erschwinglichkeit ||----------------------------------------------------|| Teuer (und es ist bereits im Angebot!) |+--------------------------------------------------- +
Beachten Sie jedoch, dass für CASE
nur 10 Verschachtelungsebenen zulässig sind Ausdrücke in SQL Server. Wenn Sie versuchen, mehr als 10 Ebenen zu verschachteln, erhalten Sie eine Fehlermeldung.
CASE in einer ORDER BY-Klausel
Wie bereits erwähnt, der T-SQL CASE
Ausdruck kann in jeder Anweisung oder Klausel verwendet werden, die einen gültigen Ausdruck zulässt. Daher können Sie es in Anweisungen wie SELECT
verwenden , UPDATE
, DELETE
und SET
, und in Klauseln wie IN
, WHERE
, ORDER BY
, GROUP BY
, und HAVING
.
Verwenden eines CASE
Ausdruck im ORDER BY
einer Anweisung -Klausel kann praktisch sein, wenn Sie beim Sortieren Ihrer Ergebnisse eine Ausnahme für bestimmte Werte machen möchten.
Angenommen, wir führen die folgende Abfrage für eine Tabelle aus, die Musikgenres enthält.
SELECT Genre
FROM MusicGenres
ORDER BY Genre ASC;
Ergebnis:
+---------+| Genre ||---------|| Blues || Land || Hip-Hop || Jazz || Metall || Andere || Pop || Rap || Felsen |+---------+
Hier ordnen wir die Ergebnisse nach Genre
Spalte, in aufsteigender Reihenfolge.
Das ist in Ordnung, bis auf eine Sache. Das Genre namens Andere . Wäre es nicht schön, wenn wir Other verschieben könnten nach unten?
Dies erreichen wir mit dem CASE
Ausdruck, indem Sie die obige Abfrage nehmen und wie folgt ändern.
SELECT Genre
FROM MusicGenres
ORDER BY
CASE Genre
WHEN 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
Ergebnis:
+---------+| Genre ||---------|| Blues || Land || Hip-Hop || Jazz || Metall || Pop || Rap || Felsen || Andere |+---------+
CASE in einer UPDATE-Anweisung
Hier ist ein Beispiel für die Verwendung eines CASE
Ausdruck in einem UPDATE
Aussage.
Angenommen, wir haben die folgende Tabelle:
+---------+-----------+-----------+----------+| Hunde-ID | Hundename | Guter Hund | Abendessen ||---------+-----------+-----------+----------|| 1 | Holen | 1 | NULL || 2 | Flauschig | 0 | NULL || 3 | Wackeln | 0 | NULL || 1001 | Brian | 1 | NULL || 1002 | Rambos | 0 | NULL || 1003 | BamBam | 1 | NULL |+---------+-----------+-----------+----------+Wir haben kürzlich das
Dinner
hinzugefügt Spalte, und es ist immer nochNULL
, wartet auf das Einfügen von Werten.Aber die einzufügenden Werte hängen vom Wert des
GoodDog
ab Säule.Wir könnten einen
CASE
verwenden Ausdruck in einem solchen Szenario.UPDATE Dogs SET Dinner = CASE GoodDog WHEN 1 THEN 'Sunday Roast' ELSE 'Airline food' END SELECT * FROM Dogs;
Ergebnis:
+---------+-----------+-----------+------------ --+| Hunde-ID | Hundename | Guter Hund | Abendessen ||---------+-----------+-----------+------------- -|| 1 | Holen | 1 | Sonntagsbraten || 2 | Flauschig | 0 | Flugessen || 3 | Wackeln | 0 | Flugessen || 1001 | Brian | 1 | Sonntagsbraten || 1002 | Rambos | 0 | Flugessen || 1003 | BamBam | 1 | Sonntagsbraten |+---------+-----------+-----------+------------ --+CASE in einer INSERT-Anweisung
Wir können die Tabelle aus dem obigen Beispiel nehmen und einen neuen Wert einfügen.
Und wir können uns wieder den
CASE
zunutze machen Ausdruck, um den entsprechenden Wert inDinner
einzufügen Spalte.DECLARE @DogName nvarchar(60), @GoodDog bit; SET @DogName = 'Lazy'; SET @GoodDog = 0; INSERT INTO Dogs ( DogName, GoodDog, Dinner ) VALUES ( @DogName, @GoodDog, CASE @GoodDog WHEN 1 THEN 'Sunday Roast' ELSE 'Airline food' END ); SELECT * FROM Dogs;
Ergebnis:
+---------+-----------+-----------+------------ --+| Hunde-ID | Hundename | Guter Hund | Abendessen ||---------+-----------+-----------+------------- -|| 1 | Holen | 1 | Sonntagsbraten || 2 | Flauschig | 0 | Flugessen || 3 | Wackeln | 0 | Flugessen || 1001 | Brian | 1 | Sonntagsbraten || 1002 | Rambos | 0 | Flugessen || 1003 | BamBam | 1 | Sonntagsbraten || 1004 | faul | 0 | Flugessen |+---------+-----------+-----------+------------ --+Diesmal der
CASE
Ausdruck wertete den Wert einer Variablen aus, die wir gerade gesetzt hatten, und fügte dann den entsprechenden Wert inDinner
ein Spalte.Ist es eine CASE-Anweisung oder ein CASE-Ausdruck?
In SQL werden viele Dinge als „Anweisung“ bezeichnet, obwohl sie eigentlich etwas anderes sind. Dies scheint auch für den T-SQL „
CASE
zuzutreffen Aussage“.Obwohl es oft als
CASE
bezeichnet wird -Anweisung, es ist genauer, sieCASE
zu nennen Ausdruck . So wird es auch in der Microsoft-Dokumentation bezeichnet.In SQL Server ist
CASE
, anstatt selbst eine Anweisung zu sein kann in jeder Anweisung oder Klausel verwendet werden, die einen gültigen Ausdruck zulässt. Ein Ausdruck ist eine Kombination aus Symbolen und Operatoren, die ausgewertet werden, um einen einzelnen Datenwert zu erhalten.Einige DBMSs unterscheiden jedoch zwischen dem
CASE
-Anweisung und derCASE
Ausdruck und haben jeweils eine etwas andere Syntax. MySQL unterscheidet zwischen demCASE
-Anweisung und denCASE
-Operator, der im Wesentlichen mitCASE
identisch ist Ausdruck.