CASE (Transact-SQL)

Aktualisiert: 14. April 2006

Wertet eine Liste von Bedingungen aus und gibt einen von mehreren möglichen Ergebnisausdrücken zurück.

Der CASE-Ausdruck verfügt über zwei Formate:

  • Beim einfachen CASE-Ausdruck wird ein Ausdruck mit mehreren einfachen Ausdrücken verglichen, um das Ergebnis zu ermitteln.
  • Beim durchsuchten CASE-Ausdruck wird eine Reihe von booleschen Ausdrücken ausgewertet, um das Ergebnis zu ermitteln.

Bei beiden Formaten wird ein optionales ELSE-Argument unterstützt.

CASE kann in allen Anweisungen oder Klauseln verwendet werden, in denen gültige Ausdrücke zulässig sind. So kann CASE z. B. in Ausdrücken wie SELECT, UPDATE, DELETE und SET und in Klauseln wie "select_list", IN, WHERE, ORDER BY und HAVING verwendet werden.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

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

Argumente

  • input_expression
    Der Ausdruck, der ausgewertet wird, wenn das einfache CASE-Format verwendet wird. input_expression kann ein beliebiger gültiger Ausdruck sein.
  • WHEN when_expression
    Ein einfacher Ausdruck, mit dem input_expression verglichen wird, wenn das einfache CASE-Format verwendet wird. when_expression kann ein beliebiger gültiger Ausdruck sein. Die Datentypen von input_expression und allen when_expression-Ausdrücken müssen gleich sein, oder es muss eine implizite Konvertierung vorliegen.
  • THEN result_expression
    Der Ausdruck, der zurückgegeben wird, wenn input_expression gleich when_expression als TRUE ausgewertet wird oder wenn Boolean_expression als TRUE ausgewertet wird. result expression kann ein beliebiger gültiger Ausdruck sein.
  • ELSE else_result_expression
    Der Ausdruck, der zurückgegeben wird, wenn keine Vergleichsoperation als TRUE ausgewertet wird. Wird dieses Argument nicht angegeben und wird keine Vergleichsoperation als TRUE ausgewertet, gibt die CASE-Funktion NULL zurück. else_result_expression kann ein beliebiger gültiger Ausdruck sein. Die Datentypen von else_result_expression und allen result_expression-Ausdrücken müssen gleich sein, oder es muss eine implizite Konvertierung vorliegen.
  • WHEN Boolean_expression
    Der boolesche Ausdruck, der ausgewertet wird, wenn das durchsuchte CASE-Format verwendet wird. Boolean_expression kann ein beliebiger gültiger boolescher Ausdruck sein.

Hinweise

In SQL Server ist für CASE-Ausdrücke nur eine Schachtelung von 10 Ebenen zulässig.

Der CASE-Ausdruck kann nicht dazu verwendet werden, den Ausführungsablauf von Anweisungen, Anweisungsblöcken, benutzerdefinierten Funktionen und gespeicherten Prozeduren zu steuern. Eine Liste der Ablaufsteuerungsmethoden finden Sie unter Ablaufsteuerungssprache (Transact-SQL).

Ergebnistypen

Gibt den Typ mit der höchsten Rangfolge von den Typen in result_expressions und dem optionalen else_result_expression-Ausdruck zurück. Weitere Informationen finden Sie unter Rangfolge der Datentypen (Transact-SQL).

Ergebniswerte

Einfacher CASE-Ausdruck:

Beim einfachen CASE-Ausdruck wird der erste Ausdruck mit dem Ausdruck in jeder WHEN-Klausel auf Übereinstimmung verglichen. Wenn sich die Ausdrücke entsprechen, wird der Ausdruck in der THEN-Klausel zurückgegeben.

  • Es ist nur eine Überprüfung auf Übereinstimmung möglich.
  • input_expression wird ausgewertet, und anschließend werden in der angegebenen Reihenfolge die input_expression = when_expression-Ausdrücke für jede WHEN-Klausel ausgewertet.
  • Gibt den result_expression-Ausdruck des ersten input_expression = when_expression-Ausdrucks zurück, der als TRUE ausgewertet wird.
  • Wenn kein input_expression = when_expression-Ausdruck als TRUE ausgewertet wird, gibt SQL Server-Datenbankmodul den else_result_expression-Ausdruck zurück, wenn eine ELSE-Klausel angegeben ist, oder einen NULL-Wert zurück, wenn keine ELSE-Klausel angegeben ist.

Durchsuchter CASE-Ausdruck:

  • Für jede WHEN-Klausel werden die Boolean_expression-Ausdrücke in der angegebenen Reihenfolge ausgewertet.
  • Gibt den result_expression-Ausdruck des ersten Boolean_expression-Ausdrucks zurück, der als TRUE ausgewertet wird.
  • Wird kein Boolean_expression-Ausdruck als TRUE ausgewertet, gibt Datenbankmodul, wenn eine ELSE-Klausel angegeben ist, den else_result_expression-Ausdruck zurück, oder einen NULL-Wert, wenn keine ELSE-Klausel angegeben ist.

Beispiele

A. Verwenden einer SELECT-Anweisung mit einem einfachen CASE-Ausdruck

Innerhalb einer SELECT-Anweisung ermöglicht ein einfacher CASE-Ausdruck nur eine Überprüfung auf Übereinstimmung. Andere Vergleiche werden nicht durchgeführt. Im folgenden Beispiel wird ein CASE-Ausdruck verwendet, um die Darstellung von Produktkategorien so zu ändern, dass diese leichter verständlich sind.

USE AdventureWorks;
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. Verwenden einer SELECT-Anweisung mit einem durchsuchten CASE-Ausdruck

Innerhalb einer SELECT-Anweisung können mit einem durchsuchten CASE-Ausdruck Werte im Resultset basierend auf den Vergleichsergebnissen ersetzt werden. Im folgenden Beispiel wird anstelle des Listenpreises ein Kommentar angezeigt, der sich nach der Preisspanne für ein Produkt richtet.

USE AdventureWorks;
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. Verwenden von CASE als Ersatz für die IIf-Funktion von Microsoft Access

Die von CASE bereitgestellte Funktionalität gleicht der IIf-Funktion in Microsoft Access. Das folgende Beispiel zeigt eine einfache Abfrage, die mithilfe von IIf einen Ausgabewert für die TelephoneInstructions-Spalte in einer Access-Tabelle mit dem Namen db1.ContactInfo bereitstellt.

SELECT FirstName, LastName, TelephoneNumber, 
     IIf(IsNull(TelephoneInstructions),"Any time",
     TelephoneInstructions) AS [When to Contact]
FROM db1.ContactInfo; 

Im folgenden Beispiel wird CASE verwendet, um einen Ausgabewert für die Spalte TelephoneSpecialInstructions in der AdventureWorks-Sicht Person.vAdditionalContactInfo bereitzustellen.

USE AdventureWorks;
GO
SELECT FirstName, LastName, TelephoneNumber, 'When to Contact' = 
     CASE
          WHEN TelephoneSpecialInstructions IS NULL THEN 'Any time'
          ELSE TelephoneSpecialInstructions
     END
FROM Person.vAdditionalContactInfo;

D. Verwenden von CASE in einer ORDER BY-Klausel

Im folgenden Beispiel wird der CASE-Ausdruck in einer ORDER BY-Klausel verwendet, um die Sortierreihenfolge der Zeilen anhand des Werts in der Spalte SalariedFlag der Tabelle HumanResources.Employee zu ermitteln. Mitarbeiter, für die SalariedFlag auf 1 gesetzt wurde, werden in absteigender Reihenfolge nach EmployeeID zurückgegeben. Mitarbeiter, für die SalariedFlag auf 0 gesetzt wurde, werden in aufsteigender Reihenfolge nach EmployeeID zurückgegeben.

SELECT EmployeeID, SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag WHEN 1 THEN EmployeeID END DESC
        ,CASE WHEN SalariedFlag = 0 THEN EmployeeID END;
GO

E. Verwenden von CASE in einer UPDATE-Anweisung

Im folgenden Beispiel wird der CASE-Ausdruck in einer UPDATE-Anweisung verwendet, um den Wert zu ermitteln, der in der Spalte VacationHours für Mitarbeiter festgelegt wurde, für die SalariedFlag auf 0 gesetzt ist. Wenn durch das Abziehen von zehn Stunden von VacationHours ein negativer Wert entsteht, wird VacationHours um 40 Stunden erhöht. Andernfalls wird VacationHours um 20 Stunden erhöht. Die OUTPUT-Klausel wird verwendet, um die Urlaubswerte vor und nach der Aktualisierung anzuzeigen.

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

F. Verwenden von CASE in einer SET-Anweisung

Im folgenden Beispiel wird der CASE-Ausdruck in einer SET-Anweisung in der Tabellenwertfunktion dbo.GetContactInfo verwendet. In der Datenbank AdventureWorks werden alle Daten zu den Personen in der Tabelle Person.Contact gespeichert. Bei diesen Personen kann es sich beispielsweise um Mitarbeiter, Hersteller- oder Filialvertreter oder um Verbraucher handeln. Mithilfe der Funktion wird der Vor- und Nachname einer bestimmten ContactID sowie der Kontakttyp für diese Person zurückgegeben. Der CASE-Ausdruck in der SET-Anweisung legt den Wert fest, der in der Spalte ContactType auf Grundlage des Vorhandenseins von ContactID in den (Verbraucher-)Tabellen Employee, StoreContact, VendorContact oder Individual angezeigt wird.

USE AdventureWorks;
GO
CREATE FUNCTION dbo.GetContactInformation(@ContactID int)
RETURNS @retContactInformation TABLE 
(
    ContactID int NOT NULL,
    FirstName nvarchar(50) NULL,
    LastName nvarchar(50) NULL,
    ContactType nvarchar(50) NULL,
    PRIMARY KEY CLUSTERED (ContactID 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 
        @ContactID = ContactID, 
        @FirstName = FirstName, 
        @LastName = LastName
    FROM Person.Contact 
    WHERE ContactID = @ContactID;

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

            -- Check for vendor
            WHEN EXISTS(SELECT * FROM Purchasing.VendorContact AS vc 
                    INNER JOIN Person.ContactType AS ct 
                    ON vc.ContactTypeID = ct.ContactTypeID 
                WHERE vc.ContactID = @ContactID) 
                THEN 'Vendor Contact'

            -- Check for store
            WHEN EXISTS(SELECT * FROM Sales.StoreContact AS sc 
                    INNER JOIN Person.ContactType AS ct 
                    ON sc.ContactTypeID = ct.ContactTypeID 
                WHERE sc.ContactID = @ContactID) 
                THEN 'Store Contact'

            -- Check for individual consumer
            WHEN EXISTS(SELECT * FROM Sales.Individual AS i 
                WHERE i.ContactID = @ContactID) 
                THEN 'Consumer'
        END;

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

    RETURN;
END;
GO
SELECT ContactID, FirstName, LastName, ContactType
FROM dbo.GetContactInformation(2200);
GO
SELECT ContactID, FirstName, LastName, ContactType
FROM dbo.GetContactInformation(5);

G. Verwenden von CASE in einer HAVING-Klausel

Im folgenden Beispiel wird der CASE-Ausdruck in einer HAVING-Klausel verwendet, um die von der SELECT-Anweisung zurückgegebenen Zeilen zu begrenzen. Die Anweisung gibt den maximalen Stundensatz für alle Positionen in der Tabelle HumanResources.Employee zurück. Mithilfe der HAVING-Klausel erfolgt eine Einschränkung auf Positionen von Männern mit einem Stundenhöchstsatz von mehr als 40 Dollar oder von Frauen mit einem Stundenhöchstsatz von mehr als 42 Dollar.

USE AdventureWorks;
GO
SELECT Title, MAX(ph1.Rate)AS MaximumRate
FROM HumanResources.Employee AS e
JOIN HumanResources.EmployeePayHistory AS ph1 ON e.EmployeeID = ph1.EmployeeID
GROUP BY Title
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;

Siehe auch

Verweis

Ausdrücke (Transact-SQL)
SELECT (Transact-SQL)
COALESCE (Transact-SQL)

Andere Ressourcen

Verwenden von CASE

Hilfe und Informationen

Informationsquellen für SQL Server 2005

Änderungsverlauf

Version Verlauf

14. April 2006

Neuer Inhalt:
  • Es wurde ein Beispiel für die Bereitstellung von IIf-Funktionalität mithilfe von CASE hinzugefügt.