Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Применимо к:SQL Server
База данных Azure SQL
Управляемый экземпляр Azure SQL
Azure Synapse Analytics
Система платформы аналитики (PDW)
Конечная точка SQL аналитики в Microsoft Fabric
Хранилище в Microsoft Fabric
База данных SQL в Microsoft Fabric
Оценка списка условий и возвращение одного из нескольких возможных выражений результатов.
Выражение CASE имеет два формата:
Простое
CASEвыражение сравнивает выражение с набором простых выражений для определения результата.Поисковое
CASEвыражение вычисляет набор логических выражений для определения результата.
Оба формата поддерживают необязательный ELSE аргумент.
CASE можно использовать в любом операторе или предложении, позволяющем допустимое выражение. Например, можно использовать CASE в таких инструкциях, как , SELECTUPDATE и , а DELETEтакже в предложениях, таких как SET<select_list>, , INWHEREи ORDER BYHAVING.
Соглашения о синтаксисе Transact-SQL
Syntax
Синтаксис для SQL Server, Базы данных SQL Azure и 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
Синтаксис для параллельного хранилища данных.
CASE
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
Arguments
input_expression
Выражение, вычисляемое при использовании простого CASE формата.
input_expression — это любое допустимое выражение.
КОГДА when_expression
Простое выражение, с которым input_expression сравнивается при использовании простого CASE формата.
when_expression — это любое допустимое выражение. Типы данных аргумента input_expression и каждого из выражений when_expression должны быть одинаковыми или неявно приводимыми друг к другу.
ЗАТЕМ result_expression
Выражение, возвращаемое, когда input_expression равно when_expressionTRUEили Boolean_expression вычисляется.TRUE
result expression — это любое допустимое выражение.
ИНАЧЕ else_result_expression
Выражение, возвращаемое, если операция сравнения не вычисляется TRUE. Если этот аргумент опущен и операция сравнения не вычисляется TRUE, CASE возвращается NULL.
else_result_expression — это любое допустимое выражение. Типы данных аргумента else_result_expression и каждого из выражений result_expression должны быть одинаковыми или неявно приводимыми друг к другу.
КОГДА Boolean_expression
Логическое выражение, вычисляемое при использовании искомого CASE формата.
Boolean_expression — это любое допустимое логическое выражение.
Типы возвращаемых данных
Возвращает тип с наивысшим приоритетом из набора типов в выражении result_expressions и необязательном выражении else_result_expression. Дополнительные сведения см. в разделе "Приоритет типа данных".
Возвращаемые значения
Простое выражение CASE
Простое CASE выражение работает путем сравнения первого выражения с выражением в каждом WHEN предложении для эквивалентности. Если эти выражения эквивалентны, возвращается выражение в THEN предложении.
Допускается только проверка равенства.
В указанном порядке вычисляется input_expression = when_expression для каждого
WHENпредложения.Возвращает result_expression первого input_expression = when_expression , который оценивается
TRUE.Если input_expression when_expressionне = вычисляется, ядро СУБД SQL Server возвращает
TRUE, если указано предложение, илиELSEзначение, еслиNULLпредложение неELSEуказано.
Выражение CASE для поиска
Вычисляет в указанном порядке Boolean_expression для каждого
WHENпредложения.Возвращает result_expression первого Boolean_expression , который оценивается
TRUE.Если Boolean_expression не оценивается
TRUE, ядро СУБД возвращает else_result_expression , еслиELSEуказано предложение, илиNULLзначение, если предложение неELSEуказано.
Remarks
SQL Server позволяет использовать только 10 уровней вложения в CASE выражениях.
Выражение CASE нельзя использовать для управления потоком выполнения инструкций Transact-SQL, блоков инструкций, определяемых пользователем функций и хранимых процедур. Список методов управления потока см. в разделе "Управление потоком".
Выражение CASE оценивает условия последовательно и останавливается с первым условием, условие которого удовлетворено. В некоторых ситуациях выражение вычисляется до того, как CASE выражение получает результаты выражения в качестве входных данных. При оценке этих выражений возможны ошибки. Агрегированные выражения, которые отображаются в WHEN аргументах выражения CASE , вычисляются сначала, а затем предоставляются выражению CASE . Например, следующий запрос приводит к нулевой ошибке при создании значения агрегата MAX . Этот шаг выполняется перед оценкой CASE выражения.
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
Вы должны зависеть только от порядка оценки WHEN условий скалярных выражений (включая некоррелированные вложенные запросы, возвращающие скаляры), а не для агрегатных выражений.
Кроме того, необходимо убедиться, что хотя бы одно из выражений в THEN предложениях ELSE не является константой NULL . Хотя NULL их можно вернуть из нескольких выражений результатов, не все из них могут явно быть константой NULL . Если все выражения результатов используют константу NULL , возвращается ошибка 8133.
Examples
Примеры кода в этой статье используют базу данных образца AdventureWorks2025 или AdventureWorksDW2025, которую можно скачать с домашней страницы образцов и проектов сообщества Microsoft SQL Server и.
A. Использование инструкции SELECT с простым выражением CASE
При использовании в инструкции SELECT простое выражение CASE позволяет выполнить только проверку на равенство. Другие проверки не выполняются. В следующем примере выражение CASE используется для изменения способа отображения категорий линейки продуктов с целью сделать их более понятными.
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. Использование инструкции SELECT с поисковым выражением CASE
При использовании в инструкции SELECT поисковое выражение CASE позволяет заменять значения в результирующем наборе в зависимости от результатов сравнения. В следующем примере отображается список цен в виде текстового комментария, основанного на диапазоне цен для продукта.
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. Использование CASE в предложении ORDER BY
В следующих примерах выражение в CASE предложении используется ORDER BY для определения порядка сортировки строк на основе заданного значения столбца. В первом примере вычисляется значение столбца SalariedFlag таблицы HumanResources.Employee. Сотрудники, для которых столбец SalariedFlag имеет значение 1, возвращаются в порядке BusinessEntityID (по убыванию). Сотрудники, для которых столбец SalariedFlag имеет значение 0, возвращаются в порядке 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
Во втором примере результирующий набор упорядочивается по столбцу TerritoryName, если столбец CountryRegionName содержит значение «США», и по столбцу 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. Использование CASE в инструкции UPDATE
В следующем примере выражение в инструкции используется CASE для определения значения, заданного для столбца UPDATE для сотрудников с VacationHours заданным значением 0.SalariedFlag Если при вычитании 10 часов из VacationHours получается отрицательное значение, VacationHours увеличивается на 40 часов. В противном случае значение VacationHours увеличивается на 20 часов. Предложение OUTPUT используется для отображения значений до и после отпуска.
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. Использование CASE в инструкции SET
В следующем примере выражение используется CASE в инструкции в SET табличном значении функции dbo.GetContactInfo. В базе данных AdventureWorks2025 все данные, связанные с людьми, хранятся в таблице Person.Person. Например, человек может быть сотрудником, представителем поставщика или клиентом. Функция возвращает имя (FirstName) и семейное имяLastName () заданного BusinessEntityID и типа контакта для этого человека. Выражение CASE в SET инструкции определяет значение, отображаемое для столбца на основе существования столбца ContactTypeBusinessEntityID в EmployeeVendorтаблицах или 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. Использование CASE в предложении HAVING
В следующем примере выражение в предложении используется CASE для ограничения строк, возвращаемых инструкциейHAVING.SELECT Инструкция возвращает почасовую ставку для каждого названия задания в HumanResources.Employee таблице. Это HAVING предложение ограничивает названия тех, которые удерживаются зарплатными сотрудниками с максимальной ставкой заработной платы, превышающей 40 долларов, или несалариированных сотрудников с максимальной ставкой заработной платы, превышающей 15 долларов.
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. Использование вложенного выражения CASE для классификации результатов
В следующем примере используется вложенное CASE выражение для классификации продуктов на основе ListPrice. Если цена на продукт превышает 1000 долларов, считается High-end. Остальные продукты классифицируются в вложенных CASE выражениях на ProductLine основе и 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;
Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)
H. Использование инструкции SELECT с выражением CASE
SELECT В инструкции CASE выражение позволяет заменить значения в результирующем наборе на основе значений сравнения. В следующем примере выражение CASE используется для изменения способа отображения категорий линейки продуктов с целью сделать их более понятными. Если значение не существует, отображается текст 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. Использование CASE в инструкции UPDATE
В следующем примере выражение в инструкции используется CASE для определения значения, заданного для столбца UPDATE для сотрудников с VacationHours заданным значением 0.SalariedFlag Если при вычитании 10 часов из VacationHours получается отрицательное значение, VacationHours увеличивается на 40 часов. В противном случае значение VacationHours увеличивается на 20 часов.
UPDATE dbo.DimEmployee
SET VacationHours = (
CASE
WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40
ELSE (VacationHours + 20.00)
END
)
WHERE SalariedFlag = 0;
GO