Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server-CASE-Ausdruck

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 noch NULL , 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 in Dinner 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 in Dinner 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, sie CASE 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 der CASE Ausdruck und haben jeweils eine etwas andere Syntax. MySQL unterscheidet zwischen dem CASE -Anweisung und den CASE -Operator, der im Wesentlichen mit CASE identisch ist Ausdruck.