Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Verwaltete Azure SQL-Instanz
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL-Analyseendpunkt in Microsoft Fabric
Lagerhaus in Microsoft Fabric
SQL-Datenbank in Microsoft Fabric
Wertet eine Liste von Bedingungen aus und gibt einen von mehreren möglichen Ergebnisausdrücken zurück.
Der CASE-Ausdruck weist zwei Formate auf:
Der einfache
CASEAusdruck vergleicht einen Ausdruck mit einer Gruppe einfacher Ausdrücke, um das Ergebnis zu bestimmen.Der durchsuchte Ausdruck wertet
CASEeinen Satz boolescher Ausdrücke aus, um das Ergebnis zu bestimmen.
Beide Formate unterstützen ein optionales ELSE Argument.
CASE kann in einer beliebigen Anweisung oder Klausel verwendet werden, die einen gültigen Ausdruck zulässt. Sie können CASE z. B. in Anweisungen wie SELECT, UPDATE, DELETE und SET, und in Klauseln wie <select_list>, , IN, WHERE, ORDER BYund HAVING.
Transact-SQL-Syntaxkonventionen
Syntax
Syntax für SQL Server, Azure SQL-Datenbank und Azure Synapse Analytics.
-- 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 für Parallel Data Warehouse.
CASE
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
Arguments
input_expression
Der Ausdruck, der ausgewertet wird, wenn das einfache CASE-Format verwendet wird.
input_expression ist ein gültiger Ausdruck.
WANN when_expression
Ein einfacher Ausdruck, mit dem input_expression verglichen wird, wenn das einfache CASE-Format verwendet wird.
when_expression ist ein gültiger Ausdruck. Die Datentypen von input_expression und allen when_expression-Ausdrücken müssen gleich sein, oder es muss eine implizite Konvertierung vorliegen.
DANN result_expression
Der Ausdruck, der zurückgegeben wird, wenn input_expression gleich when_expression ausgewertet TRUEwird, oder Boolean_expression ausgewertet wird TRUE.
result expression ist ein gültiger Ausdruck.
ELSE-else_result_expression
Der Ausdruck wird zurückgegeben, wenn kein Vergleichsvorgang ausgewertet wird TRUE. Wenn dieses Argument ausgelassen wird und kein Vergleichsvorgang TRUEausgewertet wird, CASE wird zurückgegeben NULL.
else_result_expression ist ein gültiger Ausdruck. Die Datentypen von else_result_expression und allen result_expression-Ausdrücken müssen gleich sein, oder es muss eine implizite Konvertierung vorliegen.
WANN Boolean_expression
Der boolesche Ausdruck, der ausgewertet wird, wenn das komplexe CASE-Format verwendet wird.
Boolean_expression ist in gültiger boolescher Ausdruck.
Rückgabetypen
Gibt den Typ mit höchsten Priorität in result_expressions und in dem optionalen else_result_expression-Ausdruck zurück. Weitere Informationen finden Sie unter "Rangfolge des Datentyps".
Rückgabewerte
Einfacher CASE-Ausdruck
Der einfache CASE Ausdruck wird verwendet, indem der erste Ausdruck mit dem Ausdruck in jeder WHEN Klausel für Äquivalenz verglichen wird. Wenn diese Ausdrücke gleichwertig sind, wird der Ausdruck in der THEN Klausel zurückgegeben.
Lässt nur eine Gleichheitsüberprüfung zu.
In der angegebenen Reihenfolge wird input_expression = when_expression für jede
WHENKlausel ausgewertet.Gibt den result_expression des ersten input_expression when_expression = zurück, der ausgewertet wird.
TRUEWenn kein input_expression = when_expression ausgewertet wird
TRUE, gibt das SQL Server-Datenbankmodul die else_result_expression zurück, wenn eineELSEKlausel angegeben ist, oder einenNULLWert, wenn keineELSEKlausel angegeben ist.
Durchsuchter CASE-Ausdruck
Wertet in der angegebenen Reihenfolge Boolean_expression für jede
WHENKlausel aus.Gibt result_expression des ersten Boolean_expression zurück, der ausgewertet wird
TRUE.Wenn kein Boolean_expression ausgewertet wird
TRUE, gibt das Datenbankmodul die else_result_expression zurück, wenn eineELSEKlausel angegeben ist, oder einenNULLWert, wenn keineELSEKlausel angegeben ist.
Remarks
In SQL Server ist für CASE-Ausdrücke nur eine Schachtelung von 10 Ebenen zulässig.
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. Eine Liste der Ablaufsteuerungsmethoden finden Sie unter "Control-of-Flow".
Der CASE-Ausdruck bewertet ihre Bedingungen sequenziell und hält bei der ersten Bedingung an, deren Bedingung erfüllt ist. In einigen Situationen wird ein Ausdruck bewertet, bevor ein CASE-Ausdruck die Ergebnisse des Ausdrucks als Eingabe empfängt. Bei der Bewertung dieser Ausdrücke sind Fehler möglich. Aggregatausdrücke, die in WHEN Argumenten für einen CASE Ausdruck angezeigt werden, werden zuerst ausgewertet und dann für den CASE Ausdruck bereitgestellt. Die folgende Abfrage erzeugt z. B. beim Erzeugen des Werts des MAX Aggregats eine Division durch Nullfehler. Dieser Schritt tritt auf, bevor der CASE Ausdruck ausgewertet wird.
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;
GO
Sie sollten nur von der Reihenfolge der Auswertung der WHEN Bedingungen für skalare Ausdrücke (einschließlich nicht korrelierte Unterabfragen, die Skalare zurückgeben) und nicht für Aggregatausdrücke abhängig sein.
Sie müssen auch sicherstellen, dass mindestens einer der Ausdrücke in den THEN Oder-Klauseln ELSE nicht die NULL Konstante ist. Es NULL kann zwar aus mehreren Ergebnisausdrücken zurückgegeben werden, aber nicht alle können die NULL Konstante sein. Wenn alle Ergebnisausdrücke die NULL Konstante verwenden, wird Fehler 8133 zurückgegeben.
Examples
Die Codebeispiele in diesem Artikel verwenden die AdventureWorks2025- oder AdventureWorksDW2025 Beispieldatenbank, die Sie von der Microsoft SQL Server Samples and Community Projects Homepage herunterladen können.
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 Gleichheit. Andere Vergleiche werden nicht angestellt. Im folgenden Beispiel wird ein CASE-Ausdruck verwendet, um die Anzeige von Produktkategorien so zu ändern, dass sie leichter verständlich werden.
USE AdventureWorks2022;
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 komplexen CASE-Ausdruck
Innerhalb einer SELECT-Anweisung können mit dem komplexen CASE-Ausdruck Werte im Resultset basierend auf den Vergleichsergebnissen ersetzt werden. Im folgenden Beispiel wird anstelle des Listenpreises ein Kommentar angezeigt, der vom Preisbereich der einzelnen Produkte abhängt.
USE AdventureWorks2022;
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 in einer ORDER BY-Klausel
In den folgenden Beispielen wird der CASE Ausdruck in einer ORDER BY Klausel verwendet, um die Sortierreihenfolge der Zeilen basierend auf einem bestimmten Spaltenwert zu bestimmen. Im ersten Beispiel wird der Wert in der SalariedFlag-Spalte der HumanResources.Employee-Tabelle ausgewertet. Mitarbeiter, deren SalariedFlag auf 1 festgelegt wurde, werden nach BusinessEntityID in absteigender Folge zurückgegeben. Mitarbeiter, deren SalariedFlag auf 0 festgelegt wurde, werden nach BusinessEntityID in aufsteigender Folge zurückgegeben.
SELECT BusinessEntityID,
SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag
WHEN 1 THEN BusinessEntityID
END DESC,
CASE
WHEN SalariedFlag = 0 THEN BusinessEntityID
END;
GO
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.
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;
GO
D. Verwenden von CASE in einer UPDATE-Anweisung
Im folgenden Beispiel wird der CASE Ausdruck in einer UPDATE Anweisung verwendet, um den Wert zu bestimmen, der für die Spalte VacationHours für Mitarbeiter SalariedFlag mit dem Wert 0 festgelegt ist. 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. Die OUTPUT Klausel wird verwendet, um die Werte vor und nach dem Urlaub anzuzeigen.
USE AdventureWorks2022;
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;
GO
E. Verwenden von CASE in einer SET-Anweisung
Im folgenden Beispiel wird der CASE Ausdruck in einer SET Anweisung in der Tabellenwertfunktion dbo.GetContactInfoverwendet. In der AdventureWorks2025-Datenbank werden alle Daten zu Personen in der Person.Person-Tabelle gespeichert. Beispielsweise kann es sich bei der Person um einen Mitarbeiter, einen Verkäufer oder einen Kunden handelt. Die Funktion gibt den Vornamen (FirstName) und den Familiennamen (LastName) eines bestimmten BusinessEntityID Typs und den Kontakttyp für diese Person zurück. Der CASE Ausdruck in der SET Anweisung bestimmt den Wert, der für die Spalte angezeigt werden soll, basierend auf dem Vorhandensein der Spalte ContactType in den BusinessEntityIDEmployee, Vendoroder Customer Tabellen.
USE AdventureWorks2022;
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);
GO
F. Verwenden von CASE in einer HAVING-Klausel
Im folgenden Beispiel wird der CASE Ausdruck in einer HAVING Klausel verwendet, um die zeilen einzuschränken, die von der SELECT Anweisung zurückgegeben werden. Die Anweisung gibt den maximalen Stundensatz für jede Berufsbezeichnung in der Tabelle HumanResources.Employee zurück. Die HAVING Klausel schränkt die Titel auf diejenigen ein, die von gelohnten Mitarbeitern mit einem Höchstsatz von mehr als 40 Dollar oder nicht abgesagten Mitarbeitern mit einem Höchstsatz von mehr als 15 Dollar gehalten werden.
USE AdventureWorks2022;
GO
SELECT JobTitle,
MAX(ph1.Rate) AS MaximumRate
FROM HumanResources.Employee AS e
INNER JOIN HumanResources.EmployeePayHistory AS ph1
ON e.BusinessEntityID = ph1.BusinessEntityID
GROUP BY JobTitle
HAVING (
MAX(CASE
WHEN SalariedFlag = 1 THEN ph1.Rate
ELSE NULL
END) > 40.00
OR MAX(CASE
WHEN SalariedFlag = 0 THEN ph1.Rate
ELSE NULL
END) > 15.00
)
ORDER BY MaximumRate DESC;
GO
G. Verwenden eines geschachtelten CASE-Ausdrucks zum Kategorisieren von Ergebnissen
Im folgenden Beispiel wird ein geschachtelter CASE Ausdruck verwendet, um Produkte basierend auf ListPrice. Wenn ein Produktlistenpreis 1.000 Dollar überschreitet, wird er berücksichtigt High-end. Die verbleibenden Produkte werden in einem geschachtelten CASE Ausdruck basierend auf ProductLine und ListPrice.
USE AdventureWorks2022;
GO
SELECT
ProductNumber,
Name,
ListPrice,
PriceCategory =
CASE
WHEN ListPrice > 1000 THEN 'High-end'
ELSE
CASE ProductLine
WHEN 'R' THEN
CASE
WHEN ListPrice > 500 THEN 'Premium Road'
ELSE 'Standard Road'
END
WHEN 'M' THEN
CASE
WHEN ListPrice > 500 THEN 'Premium Mountain'
ELSE 'Standard Mountain'
END
WHEN 'T' THEN 'Touring'
ELSE 'Other'
END
END
FROM Production.Product
ORDER BY ListPrice DESC;
Beispiele: Azure Synapse Analytics und Analytics-Plattformsystem (PDW)
H. Verwenden einer SELECT-Anweisung mit einem CASE-Ausdruck
Innerhalb einer SELECT Anweisung ermöglicht der CASE Ausdruck, dass Werte im Resultset basierend auf Vergleichswerten ersetzt werden können. Im folgenden Beispiel wird ein CASE-Ausdruck verwendet, um die Anzeige von Produktkategorien so zu ändern, dass sie leichter verständlich werden. Wenn kein Wert vorhanden ist, wird der Text Not for sale angezeigt.
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;
GO
Ich. Verwenden von CASE in einer UPDATE-Anweisung
Im folgenden Beispiel wird der CASE Ausdruck in einer UPDATE Anweisung verwendet, um den Wert zu bestimmen, der für die Spalte VacationHours für Mitarbeiter SalariedFlag mit dem Wert 0 festgelegt ist. 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.
UPDATE dbo.DimEmployee
SET VacationHours = (
CASE
WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40
ELSE (VacationHours + 20.00)
END
)
WHERE SalariedFlag = 0;
GO