Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Punkt końcowy analizy SQL w usłudze Microsoft Fabric
Hurtownia danych w usłudze Microsoft Fabric
Baza danych SQL w usłudze Microsoft Fabric
Oblicza listę warunków i zwraca jedno z wielu możliwych wyrażeń wyników.
Wyrażenie CASE ma dwa formaty:
Wyrażenie proste
CASEporównuje wyrażenie z zestawem wyrażeń prostych w celu określenia wyniku.Wyszukiwane
CASEwyrażenie oblicza zestaw wyrażeń logicznych w celu określenia wyniku.
Oba formaty obsługują opcjonalny ELSE argument.
CASE można użyć w dowolnej instrukcji lub klauzuli, która zezwala na prawidłowe wyrażenie. Można na przykład użyć CASE instrukcji, takich jak , SELECTUPDATEi , i DELETEw klauzulach, takich jak SET<select_list>, IN, WHERE, ORDER BY, i HAVING.
Transact-SQL konwencje składni
Syntax
Składnia dla programu SQL Server, usługi Azure SQL Database i usługi 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
Składnia dla magazynu danych równoległych.
CASE
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
Arguments
input_expression
Wyrażenie obliczane w przypadku użycia prostego CASE formatu.
input_expression jest dowolnym prawidłowym wyrażeniem.
KIEDY when_expression
Proste wyrażenie, do którego input_expression jest porównywane podczas użycia prostego CASE formatu.
when_expression jest dowolnym prawidłowym wyrażeniem. Typy danych input_expression i każdy when_expression muszą być takie same lub muszą być niejawną konwersją.
NASTĘPNIE result_expression
Wyrażenie zwracane, gdy input_expression równa się when_expression daje wartość TRUE, lub Boolean_expression daje wartość .TRUE
wyrażenie wyniku jest dowolnym prawidłowym wyrażeniem.
ELSE_RESULT_EXPRESSION ELSE
Wyrażenie zwracane, jeśli żadna operacja porównania nie daje wartości .TRUE Jeśli ten argument zostanie pominięty, a żadna operacja porównania nie zwróci TRUEwartości , CASE zwraca wartość NULL.
else_result_expression jest dowolnym prawidłowym wyrażeniem. Typy danych else_result_expression i wszystkie result_expression muszą być takie same lub muszą być niejawną konwersją.
KIEDY Boolean_expression
Wyrażenie warunkowe obliczane podczas korzystania z wyszukiwanego CASE formatu.
Boolean_expression jest dowolnym prawidłowym wyrażeniem logicznym.
Typy zwracane
Zwraca najwyższy typ pierwszeństwa z zestawu typów w result_expressions i opcjonalnych else_result_expression. Aby uzyskać więcej informacji, zobacz Pierwszeństwo typu danych.
Wartości zwracane
Proste wyrażenie CASE
Wyrażenie proste CASE działa, porównując pierwsze wyrażenie z wyrażeniem w każdej WHEN klauzuli pod kątem równoważności. Jeśli te wyrażenia są równoważne, wyrażenie w klauzuli THEN jest zwracane.
Umożliwia tylko sprawdzanie równości.
W określonej kolejności oblicza input_expression = when_expression dla każdej
WHENklauzuli.Zwraca result_expression pierwszego input_expression when_expression = , który daje wartość .
TRUEJeśli żaden input_expression when_expression = nie zwróci
TRUEwartości , aparat bazy danych programu SQL Server zwraca else_result_expression, jeśli określono klauzulęELSENULL, lub wartość, jeśli nieELSEokreślono żadnej klauzuli.
Przeszukane wyrażenie CASE
Oblicza w podanej kolejności Boolean_expression dla każdej
WHENklauzuli.Zwraca result_expression pierwszego Boolean_expression, który daje wartość .
TRUEJeśli żadna Boolean_expression nie zwróci
TRUEwartości , aparat bazy danych zwróci else_result_expression , jeśli określono klauzulęELSENULLlub wartość, jeśli nieELSEokreślono klauzuli.
Remarks
Program SQL Server umożliwia zagnieżdżanie tylko 10 poziomów w wyrażeniach CASE .
Nie CASE można użyć wyrażenia do kontrolowania przepływu wykonywania instrukcji Transact-SQL, bloków instrukcji, funkcji zdefiniowanych przez użytkownika i procedur składowanych. Aby uzyskać listę metod sterowania przepływem, zobacz Control-of-Flow.
Wyrażenie CASE oblicza warunki sekwencyjnie i zatrzymuje się z pierwszym warunkiem, którego warunek jest spełniony. W niektórych sytuacjach wyrażenie jest obliczane, zanim CASE wyrażenie otrzyma wyniki wyrażenia jako jego dane wejściowe. Możliwe są błędy podczas oceniania tych wyrażeń. Wyrażenia agregujące, które pojawiają się w WHEN argumentach w wyrażeniu CASE , są najpierw obliczane, a następnie dostarczane do CASE wyrażenia. Na przykład następujące zapytanie generuje błąd dzielenia przez zero podczas tworzenia wartości MAX agregacji. Ten krok występuje przed oceną CASE wyrażenia.
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
Należy zależeć tylko od kolejności obliczania WHEN warunków dla wyrażeń skalarnych (w tym niekorrelowanych podzapytania, które zwracają skalarne), a nie dla wyrażeń agregujących.
Należy również upewnić się, że co najmniej jedno z wyrażeń w THEN klauzulach or ELSE nie jest stałą NULL . Chociaż NULL może być zwracany z wielu wyrażeń wyników, nie wszystkie z nich mogą być jawnie stałą NULL . Jeśli wszystkie wyrażenia wyników używają stałej NULL , zwracany jest błąd 8133.
Examples
Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2025 lub AdventureWorksDW2025, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.
A. Używanie instrukcji SELECT z prostym wyrażeniem CASE
W ramach SELECT instrukcji proste CASE wyrażenie umożliwia tylko sprawdzenie równości; nie są wykonywane żadne inne porównania. W poniższym przykładzie użyto CASE wyrażenia , aby zmienić wyświetlanie kategorii linii produktów, aby uczynić je bardziej zrozumiałymi.
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. Używanie instrukcji SELECT z wyszukiwanym wyrażeniem CASE
W ramach SELECT instrukcji wyszukiwane CASE wyrażenie umożliwia zastąpienie wartości w zestawie wyników na podstawie wartości porównania. W poniższym przykładzie cena cennika jest wyświetlana jako komentarz tekstowy na podstawie zakresu cen produktu.
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. Używanie funkcji CASE w klauzuli ORDER BY
W poniższych przykładach użyto CASE wyrażenia w ORDER BY klauzuli , aby określić kolejność sortowania wierszy na podstawie danej wartości kolumny. W pierwszym przykładzie wartość w SalariedFlag kolumnie HumanResources.Employee tabeli jest obliczana. Pracownicy, którzy mają ustawioną SalariedFlag wartość 1, są zwracani w kolejności malejącej.BusinessEntityID Pracownicy, którzy mają ustawioną SalariedFlag wartość 0, są zwracani w kolejności rosnącej BusinessEntityID .
SELECT BusinessEntityID,
SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag
WHEN 1 THEN BusinessEntityID
END DESC,
CASE
WHEN SalariedFlag = 0 THEN BusinessEntityID
END;
GO
W drugim przykładzie zestaw wyników jest uporządkowany według kolumny TerritoryName , gdy kolumna CountryRegionName jest równa "Stany Zjednoczone" i dla CountryRegionName wszystkich innych wierszy.
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. Używanie funkcji CASE w instrukcji UPDATE
W poniższym przykładzie użyto CASE wyrażenia w UPDATE instrukcji, aby określić wartość ustawioną dla kolumny VacationHours dla pracowników z ustawioną wartością SalariedFlag 0. W przypadku odejmowania 10 godzin od VacationHours wyników w wartości ujemnej zwiększa VacationHours się o 40 godzin; w przeciwnym razie VacationHours zwiększa się o 20 godzin. Klauzula OUTPUT służy do wyświetlania wartości urlopu przed i po nim.
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. Używanie funkcji CASE w instrukcji SET
W poniższym przykładzie użyto CASE wyrażenia w SET instrukcji w funkcji dbo.GetContactInfotable-valued .
AdventureWorks2025 W bazie danych wszystkie dane powiązane z osobami są przechowywane w Person.Person tabeli. Na przykład osoba może być pracownikiem, przedstawicielem dostawcy lub klientem. Funkcja zwraca imię (FirstName) i nazwę rodziny (LastName) danej BusinessEntityID osoby oraz typ kontaktu dla tej osoby. Wyrażenie CASE w instrukcji SET określa wartość wyświetlaną dla kolumny ContactType na podstawie istnienia BusinessEntityID kolumny w Employeetabelach , Vendorlub Customer .
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. Używanie funkcji CASE w klauzuli HAVING
W poniższym przykładzie użyto CASE wyrażenia w klauzuli HAVING , aby ograniczyć wiersze zwracane przez instrukcję SELECT . Instrukcja zwraca stawkę godzinową dla każdego stanowiska w HumanResources.Employee tabeli. Klauzula HAVING ogranicza tytuły do tych, które są przetrzymywane przez pracowników zatrudnionych z maksymalną stawką płacową większą niż 40 dolarów lub niesalariowanych pracowników z maksymalną stawką płacową większą niż 15 dolarów.
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. Kategoryzowanie wyników przy użyciu zagnieżdżonego wyrażenia CASE
W poniższym przykładzie użyto CASE wyrażenia zagnieżdżonego do kategoryzowania produktów na ListPricepodstawie elementu . Jeśli cena cennika produktu przekracza 1000 dolarów, jest to uważane za High-end. Pozostałe produkty są podzielone na kategorie w wyrażeniu zagnieżdżonym CASE na ProductLine podstawie elementów i 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;
Przykłady: Azure Synapse Analytics and Analytics Platform System (PDW)
H. Używanie instrukcji SELECT z wyrażeniem CASE
W ramach SELECT instrukcji CASE wyrażenie umożliwia zastąpienie wartości w zestawie wyników na podstawie wartości porównania. W poniższym przykładzie użyto CASE wyrażenia , aby zmienić wyświetlanie kategorii linii produktów, aby uczynić je bardziej zrozumiałymi. Gdy wartość nie istnieje, zostanie wyświetlony tekst Not for sale .
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
I. Używanie funkcji CASE w instrukcji UPDATE
W poniższym przykładzie użyto CASE wyrażenia w UPDATE instrukcji, aby określić wartość ustawioną dla kolumny VacationHours dla pracowników z ustawioną wartością SalariedFlag 0. W przypadku odejmowania 10 godzin od VacationHours wyników w wartości ujemnej zwiększa VacationHours się o 40 godzin; w przeciwnym razie VacationHours zwiększa się o 20 godzin.
UPDATE dbo.DimEmployee
SET VacationHours = (
CASE
WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40
ELSE (VacationHours + 20.00)
END
)
WHERE SalariedFlag = 0;
GO