CASE (Transact-SQL)CASE (Transact-SQL)

DIESES THEMA GILT FÜR: jaSQL Server (ab 2008)jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Wertet eine Liste von Bedingungen aus und gibt einen von mehreren möglichen Ergebnisausdrücken zurück.Evaluates a list of conditions and returns one of multiple possible result expressions.

Der CASE-Ausdruck verfügt über zwei Formate:The CASE expression has two formats:

  • Der einfache CASE-Ausdruck vergleicht einen Ausdruck mit mehreren einfachen Ausdrücken, um das Ergebnis zu bestimmen.The simple CASE expression compares an expression to a set of simple expressions to determine the result.

  • Der komplexe CASE-Ausdruck wertet eine Menge boolescher Ausdrücke aus, um das Ergebnis zu bestimmen.The searched CASE expression evaluates a set of Boolean expressions to determine the result.

    Bei beiden Formaten wird ein optionales ELSE-Argument unterstützt.Both formats support an optional ELSE argument.

    CASE kann in einer beliebigen Anweisung oder Klausel verwendet werden, die einen gültigen Ausdruck zulässt.CASE can be used in any statement or clause that allows a valid expression. Beispielsweise können CASE-Anweisungen wie SELECT, UPDATE, DELETE und SET und Klauseln wie select_list, IN, WHERE, ORDER BY und HAVING verwendet werden.For example, you can use CASE in statements such as SELECT, UPDATE, DELETE and SET, and in clauses such as select_list, IN, WHERE, ORDER BY, and HAVING.

    Themenlinksymbol Transact-SQL Syntax Conventions (Transact-SQL-Syntaxkonventionen)Topic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

-- Syntax for SQL Server and Azure SQL Database  

Simple CASE expression:   
CASE input_expression   
     WHEN when_expression THEN result_expression [ ...n ]   
     [ ELSE else_result_expression ]   
END   
Searched CASE expression:  
CASE  
     WHEN Boolean_expression THEN result_expression [ ...n ]   
     [ ELSE else_result_expression ]   
END  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

CASE  
     WHEN when_expression THEN result_expression [ ...n ]   
     [ ELSE else_result_expression ]   
END  

ArgumenteArguments

input_expressioninput_expression
Der Ausdruck, der ausgewertet wird, wenn das einfache CASE-Format verwendet wird.Is the expression evaluated when the simple CASE format is used. Input_expression ist ein beliebiger gültiger Ausdruck.input_expression is any valid expression.

Wenn When_expressionWHEN when_expression
Ein einfacher Ausdruck, der Input_expression verglichen wird, wenn das einfache CASE-Format verwendet wird.Is a simple expression to which input_expression is compared when the simple CASE format is used. When_expression kann jeder gültige Ausdruck.when_expression is any valid expression. Die Datentypen der Input_expression und jede When_expression müssen identisch sein oder muss eine implizite Konvertierung.The data types of input_expression and each when_expression must be the same or must be an implicit conversion.

Klicken Sie dann Result_expressionTHEN result_expression
Wird der Ausdruck zurückgegeben, wenn Input_expression gleich When_expression TRUE ergibt, oder Boolean_expression auf "true" ergibt.Is the expression returned when input_expression equals when_expression evaluates to TRUE, or Boolean_expression evaluates to TRUE. -Ergebnisausdrücke ist ein beliebiger gültiger Ausdruck.result expression is any valid expression.

ELSE Else_result_expressionELSE else_result_expression
Der Ausdruck, der zurückgegeben wird, wenn keine Vergleichsoperation TRUE ergibt.Is the expression returned if no comparison operation evaluates to TRUE. Wenn dieses Argument weggelassen wird und keine Vergleichsoperation als TRUE ausgewertet wird, gibt die CASE-Funktion NULL zurück.If this argument is omitted and no comparison operation evaluates to TRUE, CASE returns NULL. Else_result_expression kann jeder gültige Ausdruck.else_result_expression is any valid expression. Die Datentypen der Else_result_expression und ein beliebiger Result_expression müssen identisch sein oder muss eine implizite Konvertierung.The data types of else_result_expression and any result_expression must be the same or must be an implicit conversion.

Wenn Boolean_expressionWHEN Boolean_expression
Der boolesche Ausdruck, der ausgewertet wird, wenn das komplexe CASE-Format verwendet wird.Is the Boolean expression evaluated when using the searched CASE format. Boolean_expression kann jeder gültiger boolesche Ausdruck.Boolean_expression is any valid Boolean expression.

RückgabetypenReturn Types

Gibt den Typ der höchsten Rangfolge aus dem Satz von Typen in Result_expressions und dem optionalen Else_result_expression.Returns the highest precedence type from the set of types in result_expressions and the optional else_result_expression. Weitere Informationen finden Sie unter Rangfolge der Datentypen (Transact-SQL).For more information, see Data Type Precedence (Transact-SQL).

RückgabewerteReturn Values

Einfache CASE-Ausdruck:Simple CASE expression:

Beim einfachen CASE-Ausdruck wird verglichen, ob der erste Ausdruck mit dem Ausdruck in den einzelnen WHEN-Klauseln gleichwertig ist.The simple CASE expression operates by comparing the first expression to the expression in each WHEN clause for equivalency. Wenn diese Ausdrücke gleichwertig sind, wird der Ausdruck in der THEN-Klausel zurückgegeben.If these expressions are equivalent, the expression in the THEN clause will be returned.

  • Lässt nur eine Gleichheitsüberprüfung zu.Allows only an equality check.

  • In der angegebenen Reihenfolge die input_expression = When_expression für jede WHEN-Klausel.In the order specified, evaluates input_expression = when_expression for each WHEN clause.

  • Gibt die Result_expression des ersten Input_expression = When_expression , der auf "true" ausgewertet wird.Returns the result_expression of the first input_expression = when_expression that evaluates to TRUE.

  • Wenn kein Input_expression = When_expression auf "true", wertet der SQL Server-DatenbankmodulSQL Server Database Engine gibt die Else_result_expression ist eine ELSE-Klausel angegeben wird, oder ein NULL-Wert, wenn keine ELSE-Klausel angegeben wird.If no input_expression = when_expression evaluates to TRUE, the SQL Server-DatenbankmodulSQL Server Database Engine returns the else_result_expression if an ELSE clause is specified, or a NULL value if no ELSE clause is specified.

    Komplexer CASE-Ausdruck:Searched CASE expression:

  • Ausgewertet wird, in der angegebenen Reihenfolge Boolean_expression für jede WHEN-Klausel.Evaluates, in the order specified, Boolean_expression for each WHEN clause.

  • Gibt Result_expression des ersten Boolean_expression , der auf "true" ausgewertet wird.Returns result_expression of the first Boolean_expression that evaluates to TRUE.

  • Wenn kein Boolean_expression TRUE ergibt, der DatenbankmodulDatabase Engine gibt die Else_result_expression Falls eine ELSE-Klausel angegeben wird, oder ein NULL-Wert, wenn keine ELSE-Klausel angegeben wird.If no Boolean_expression evaluates to TRUE, the DatenbankmodulDatabase Engine returns the else_result_expression if an ELSE clause is specified, or a NULL value if no ELSE clause is specified.

HinweiseRemarks

In SQL ServerSQL Server ist für CASE-Ausdrücke nur eine Schachtelung von 10 Ebenen zulässig. SQL ServerSQL Server allows for only 10 levels of nesting in CASE expressions.

Der CASE-Ausdruck kann nicht verwendet werden, um den Ablauf bei der Ausführung von Transact-SQL-Anweisungen, Anweisungsblöcken, benutzerdefinierten Funktionen und gespeicherten Prozeduren zu steuern.The CASE expression cannot be used to control the flow of execution of Transact-SQL statements, statement blocks, user-defined functions, and stored procedures. Eine Liste der Control-of-Flow-Methoden, finden Sie unter Control-of-Flow-Sprache ( Transact-SQL ) .For a list of control-of-flow methods, see Control-of-Flow Language (Transact-SQL).

Die CASE-Anweisung bewertet ihre Bedingungen sequenziell und hält bei der ersten Bedingung an, deren Bedingung erfüllt ist.The CASE statement evaluates its conditions sequentially and stops with the first condition whose condition is satisfied. In einigen Situationen wird ein Ausdruck bewertet, bevor eine CASE-Anweisung die Ergebnisse des Ausdrucks als Eingabe empfängt.In some situations, an expression is evaluated before a CASE statement receives the results of the expression as its input. Bei der Bewertung dieser Ausdrücke sind Fehler möglich.Errors in evaluating these expressions are possible. Aggregierte Ausdrücke, die in WHEN-Argumenten zu einer CASE-Anweisung angezeigt werden, werden zuerst bewertet und dann der CASE-Anweisung bereitgestellt.Aggregate expressions that appear in WHEN arguments to a CASE statement are evaluated first, then provided to the CASE statement. Beim Erzeugen des MAX-Aggregat-Werts erzeugt die folgende Abfrage beispielsweise einen Fehler aufgrund einer Division durch Null.For example, the following query produces a divide by zero error when producing the value of the MAX aggregate. Dies erfolgt vor dem Auswerten des CASE-Ausdrucks.This occurs prior to evaluating the CASE expression.

WITH Data (value) AS   
(   
SELECT 0   
UNION ALL   
SELECT 1   
)   
SELECT   
   CASE   
      WHEN MIN(value) <= 0 THEN 0   
      WHEN MAX(1/value) >= 100 THEN 1   
   END   
FROM Data ;  

Sie sollten nur von der Reihenfolge der Bewertung der WHEN-Bedingungen für skalare Ausdrücke abhängig sein (einschließlich nicht korrelierter Unterabfragen, die Skalare zurückgeben), nicht für aggregierte Ausdrücke.You should only depend on order of evaluation of the WHEN conditions for scalar expressions (including non-correlated sub-queries that return scalars), not for aggregate expressions.

BeispieleExamples

A.A. Verwenden einer SELECT-Anweisung mit einem einfachen CASE-AusdruckUsing a SELECT statement with a simple CASE expression

Innerhalb einer SELECT-Anweisung ermöglicht ein einfacher CASE-Ausdruck nur eine Überprüfung auf Gleichheit. Andere Vergleiche werden nicht angestellt.Within a SELECT statement, a simple CASE expression allows for only an equality check; no other comparisons are made. Im folgenden Beispiel wird ein CASE-Ausdruck verwendet, um die Anzeige von Produktkategorien so zu ändern, dass sie leichter verständlich werden.The following example uses the CASE expression to change the display of product line categories to make them more understandable.

USE AdventureWorks2012;  
GO  
SELECT   ProductNumber, Category =  
      CASE ProductLine  
         WHEN 'R' THEN 'Road'  
         WHEN 'M' THEN 'Mountain'  
         WHEN 'T' THEN 'Touring'  
         WHEN 'S' THEN 'Other sale items'  
         ELSE 'Not for sale'  
      END,  
   Name  
FROM Production.Product  
ORDER BY ProductNumber;  
GO  

B.B. Verwenden einer SELECT-Anweisung mit einem komplexen CASE-AusdruckUsing a SELECT statement with a searched CASE expression

Innerhalb einer SELECT-Anweisung können mit dem komplexen CASE-Ausdruck Werte im Resultset basierend auf den Vergleichsergebnissen ersetzt werden.Within a SELECT statement, the searched CASE expression allows for values to be replaced in the result set based on comparison values. Im folgenden Beispiel wird anstelle des Listenpreises ein Kommentar angezeigt, der vom Preisbereich der einzelnen Produkte abhängt.The following example displays the list price as a text comment based on the price range for a product.

USE AdventureWorks2012;  
GO  
SELECT   ProductNumber, Name, "Price Range" =   
      CASE   
         WHEN ListPrice =  0 THEN 'Mfg item - not for resale'  
         WHEN ListPrice < 50 THEN 'Under $50'  
         WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'  
         WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'  
         ELSE 'Over $1000'  
      END  
FROM Production.Product  
ORDER BY ProductNumber ;  
GO  

C.C. Verwenden von CASE in einer ORDER BY-KlauselUsing CASE in an ORDER BY clause

In den folgenden Beispielen wird der CASE-Ausdruck in einer ORDER BY-Klausel verwendet, um die Sortierreihenfolge der Zeilen auf Grundlage eines angegebenen Spaltenwerts zu bestimmen.The following examples uses the CASE expression in an ORDER BY clause to determine the sort order of the rows based on a given column value. Im ersten Beispiel wird der Wert in der SalariedFlag-Spalte der HumanResources.Employee-Tabelle ausgewertet.In the first example, the value in the SalariedFlag column of the HumanResources.Employee table is evaluated. Mitarbeiter, deren SalariedFlag auf 1 festgelegt wurde, werden nach BusinessEntityID in absteigender Folge zurückgegeben.Employees that have the SalariedFlag set to 1 are returned in order by the BusinessEntityID in descending order. Mitarbeiter, deren SalariedFlag auf 0 festgelegt wurde, werden nach BusinessEntityID in aufsteigender Folge zurückgegeben.Employees that have the SalariedFlag set to 0 are returned in order by the BusinessEntityID in ascending order. Im zweiten Beispiel wird das Resultset nach der TerritoryName-Spalte sortiert, wenn die CountryRegionName-Spalte gleich 'United States' ist, und bei allen anderen Zeilen nach CountryRegionName.In the second example, the result set is ordered by the column TerritoryName when the column CountryRegionName is equal to 'United States' and by CountryRegionName for all other rows.

SELECT BusinessEntityID, SalariedFlag  
FROM HumanResources.Employee  
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC  
        ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;  
GO  
SELECT BusinessEntityID, LastName, TerritoryName, CountryRegionName  
FROM Sales.vSalesPerson  
WHERE TerritoryName IS NOT NULL  
ORDER BY CASE CountryRegionName WHEN 'United States' THEN TerritoryName  
         ELSE CountryRegionName END;  

D.D. Verwenden von CASE in einer UPDATE-AnweisungUsing CASE in an UPDATE statement

Im folgenden Beispiel wird der CASE-Ausdruck in einer UPDATE-Anweisung verwendet, um den Wert zu bestimmen, der für die VacationHours-Spalte für Mitarbeiter mit SalariedFlag gleich 0 festgelegt wurde.The following example uses the CASE expression in an UPDATE statement to determine the value that is set for the column VacationHours for employees with SalariedFlag set to 0. Wenn von VacationHours 10 Stunden subtrahiert werden, und dies einen negativen Wert ergibt, wird VacationHours um 40 Stunden erhöht; andernfalls wird VacationHours um 20 Stunden erhöht.When subtracting 10 hours from VacationHours results in a negative value, VacationHours is increased by 40 hours; otherwise, VacationHours is increased by 20 hours. Die OUTPUT-Klausel wird verwendet, um die Werte vor und nach dem Urlaub anzuzeigen.The OUTPUT clause is used to display the before and after vacation values.

USE AdventureWorks2012;  
GO  
UPDATE HumanResources.Employee  
SET VacationHours =   
    ( CASE  
         WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40  
         ELSE (VacationHours + 20.00)  
       END  
    )  
OUTPUT Deleted.BusinessEntityID, Deleted.VacationHours AS BeforeValue,   
       Inserted.VacationHours AS AfterValue  
WHERE SalariedFlag = 0;  

E.E. Verwenden von CASE in einer SET-AnweisungUsing CASE in a SET statement

Im folgenden Beispiel wird der CASE-Ausdruck in einer SET-Anweisung in der Tabellenwertfunktion dbo.GetContactInfo verwendet.The following example uses the CASE expression in a SET statement in the table-valued function dbo.GetContactInfo. In der AdventureWorks2012AdventureWorks2012-Datenbank werden alle Daten zu Personen in der Person.Person-Tabelle gespeichert.In the AdventureWorks2012AdventureWorks2012 database, all data related to people is stored in the Person.Person table. Die Person kann z. B. ein Mitarbeiter, herstellerkontakt oder Kunde sein.For example, the person may be an employee, vendor representative, or a customer. Die Funktion gibt den vor- und Nachnamen von einem bestimmten BusinessEntityID und den Kontakttyp für diese Person. Der CASE-Ausdruck in der SET-Anweisung bestimmt den Wert, der für die Spalte angezeigt ContactType basierend auf dem Vorhandensein der BusinessEntityID Spalte in der Employee, Vendor, oder Customer Tabellen.The function returns the first and last name of a given BusinessEntityID and the contact type for that person.The CASE expression in the SET statement determines the value to display for the column ContactType based on the existence of the BusinessEntityID column in the Employee, Vendor, or Customer tables.


USE AdventureWorks2012;  
GO  
CREATE FUNCTION dbo.GetContactInformation(@BusinessEntityID int)  
    RETURNS @retContactInformation TABLE   
(  
BusinessEntityID int NOT NULL,  
FirstName nvarchar(50) NULL,  
LastName nvarchar(50) NULL,  
ContactType nvarchar(50) NULL,  
    PRIMARY KEY CLUSTERED (BusinessEntityID ASC)  
)   
AS   
-- Returns the first name, last name and contact type for the specified contact.  
BEGIN  
    DECLARE   
        @FirstName nvarchar(50),   
        @LastName nvarchar(50),   
        @ContactType nvarchar(50);  

    -- Get common contact information  
    SELECT   
        @BusinessEntityID = BusinessEntityID,   
@FirstName = FirstName,   
        @LastName = LastName  
    FROM Person.Person   
    WHERE BusinessEntityID = @BusinessEntityID;  

    SET @ContactType =   
        CASE   
            -- Check for employee  
            WHEN EXISTS(SELECT * FROM HumanResources.Employee AS e   
                WHERE e.BusinessEntityID = @BusinessEntityID)   
                THEN 'Employee'  

            -- Check for vendor  
            WHEN EXISTS(SELECT * FROM Person.BusinessEntityContact AS bec  
                WHERE bec.BusinessEntityID = @BusinessEntityID)   
                THEN 'Vendor'  

            -- Check for store  
            WHEN EXISTS(SELECT * FROM Purchasing.Vendor AS v            
                WHERE v.BusinessEntityID = @BusinessEntityID)   
                THEN 'Store Contact'  

            -- Check for individual consumer  
            WHEN EXISTS(SELECT * FROM Sales.Customer AS c   
                WHERE c.PersonID = @BusinessEntityID)   
                THEN 'Consumer'  
        END;  

    -- Return the information to the caller  
    IF @BusinessEntityID IS NOT NULL   
    BEGIN  
        INSERT @retContactInformation  
        SELECT @BusinessEntityID, @FirstName, @LastName, @ContactType;  
    END;  

    RETURN;  
END;  
GO  

SELECT BusinessEntityID, FirstName, LastName, ContactType  
FROM dbo.GetContactInformation(2200);  
GO  
SELECT BusinessEntityID, FirstName, LastName, ContactType  
FROM dbo.GetContactInformation(5);  

F.F. Verwenden von CASE in einer HAVING-KlauselUsing CASE in a HAVING clause

Im folgenden Beispiel wird der CASE-Ausdruck in einer HAVING-Klausel verwendet, um die von der SELECT-Anweisung zurückgegebenen Zeilen einzuschränken.The following example uses the CASE expression in a HAVING clause to restrict the rows returned by the SELECT statement. Die Anweisung gibt den maximalen Stundensatz für jede Berufsbezeichnung in der HumanResources.Employee Tabelle.The statement returns the maximum hourly rate for each job title in the HumanResources.Employee table. Die HAVING-Klausel beschränkt die Bezeichnungen auf diejenigen Positionen, die von Männern mit einem maximalen Stundensatz von über 40 Dollar bzw. von Frauen mit einem maximalen Stundensatz von über 42 Dollar besetzt werden.The HAVING clause restricts the titles to those that are held by men with a maximum pay rate greater than 40 dollars or women with a maximum pay rate greater than 42 dollars.

USE AdventureWorks2012;  
GO  
SELECT JobTitle, MAX(ph1.Rate)AS MaximumRate  
FROM HumanResources.Employee AS e  
JOIN HumanResources.EmployeePayHistory AS ph1 ON e.BusinessEntityID = ph1.BusinessEntityID  
GROUP BY JobTitle  
HAVING (MAX(CASE WHEN Gender = 'M'   
        THEN ph1.Rate   
        ELSE NULL END) > 40.00  
     OR MAX(CASE WHEN Gender  = 'F'   
        THEN ph1.Rate    
        ELSE NULL END) > 42.00)  
ORDER BY MaximumRate DESC;  

Beispiele: Azure SQL Data WarehouseAzure SQL Data Warehouse und Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

G.G. Verwenden eine SELECT-Anweisung mit einer CASE-AusdruckUsing a SELECT statement with a CASE expression

Innerhalb einer SELECT-Anweisung können der CASE-Ausdruck für die Werte im Resultset basierend auf den Vergleichsergebnissen ersetzt werden.Within a SELECT statement, the CASE expression allows for values to be replaced in the result set based on comparison values. Im folgenden Beispiel wird den CASE-Ausdruck so ändern Sie die Anzeige von Produktkategorien, die leichter verständlich zu machen.The following example uses the CASE expression to change the display of product line categories to make them more understandable. Wenn kein Wert vorhanden, den Text "nicht für den Verkauf" wird angezeigt.When a value does not exist, the text “Not for sale’ is displayed.

-- Uses AdventureWorks  

SELECT   ProductAlternateKey, Category =  
      CASE ProductLine  
         WHEN 'R' THEN 'Road'  
         WHEN 'M' THEN 'Mountain'  
         WHEN 'T' THEN 'Touring'  
         WHEN 'S' THEN 'Other sale items'  
         ELSE 'Not for sale'  
      END,  
   EnglishProductName  
FROM dbo.DimProduct  
ORDER BY ProductKey;  

H.H. Verwenden von CASE in einer UPDATE-AnweisungUsing CASE in an UPDATE statement

Im folgenden Beispiel wird der CASE-Ausdruck in einer UPDATE-Anweisung verwendet, um den Wert zu bestimmen, der für die VacationHours-Spalte für Mitarbeiter mit SalariedFlag gleich 0 festgelegt wurde.The following example uses the CASE expression in an UPDATE statement to determine the value that is set for the column VacationHours for employees with SalariedFlag set to 0. Wenn von VacationHours 10 Stunden subtrahiert werden, und dies einen negativen Wert ergibt, wird VacationHours um 40 Stunden erhöht; andernfalls wird VacationHours um 20 Stunden erhöht.When subtracting 10 hours from VacationHours results in a negative value, VacationHours is increased by 40 hours; otherwise, VacationHours is increased by 20 hours.

-- Uses AdventureWorks   

UPDATE dbo.DimEmployee  
SET VacationHours =   
    ( CASE  
         WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40  
         ELSE (VacationHours + 20.00)   
       END  
    )   
WHERE SalariedFlag = 0;  

Siehe auchSee Also

Ausdrücke ( Transact-SQL ) Expressions (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
COALESCE ( Transact-SQL ) COALESCE (Transact-SQL)
IIF ( Transact-SQL ) IIF (Transact-SQL)
Wählen Sie ( Transact-SQL )CHOOSE (Transact-SQL)