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.
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
Hilfe und Informationen
Informationsquellen für SQL Server 2005
Änderungsverlauf
Version | Verlauf |
---|---|
14. April 2006 |
|