Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instância Gerenciada de SQL do Azure
Azure Synapse Analytics
Analytics Platform System (PDW)
Ponto de extremidade de análise de SQL no Microsoft Fabric
Depósito no Microsoft Fabric
Banco de dados SQL no Microsoft Fabric
Avalia uma lista de condições e retorna uma das várias expressões de resultado possíveis.
A expressão CASE tem dois formatos:
A expressão simples
CASEcompara uma expressão a um conjunto de expressões simples para determinar o resultado.A expressão pesquisada
CASEavalia um conjunto de expressões boolianas para determinar o resultado.
Ambos os formatos dão suporte a um argumento opcional ELSE .
CASE pode ser usada em qualquer instrução ou cláusula que permita uma expressão válida. Por exemplo, você pode usar CASE em instruções como SELECT, e UPDATEDELETESET, e em cláusulas como <select_list>, , IN, WHERE, e . ORDER BYHAVING
Convenções de sintaxe de Transact-SQL
Syntax
Sintaxe para SQL Server, Banco de Dados SQL do Azure e 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
Sintaxe do Parallel Data Warehouse.
CASE
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
Arguments
input_expression
A expressão avaliada quando o formato CASE simples é usado.
input_expression é qualquer expression válida.
QUANDO when_expression
Uma expressão simples com a qual input_expression é comparada quando o formato CASE simples é usado.
when_expression é qualquer expressão válida. Os tipos de dados de input_expression e cada when_expression devem ser os mesmos ou devem ser uma conversão implícita.
EM SEGUIDA , result_expression
A expressão retornada quando input_expression é igual aTRUEwhen_expression é avaliada como , ou Boolean_expression é avaliada como TRUE.
result expression é qualquer expression válida.
SE else_result_expression
A expressão retornada se nenhuma operação de comparação for avaliada como TRUE. Se esse argumento for omitido e nenhuma operação de comparação for avaliada como TRUE, CASE retornará NULL.
else_result_expression é qualquer expressão válida. Os tipos de dados de else_result_expression e qualquer result_expression devem ser os mesmos ou devem ser uma conversão implícita.
QUANDO Boolean_expression
A expressão booliana avaliada quando o formato CASE simples é usado.
Boolean_expression é qualquer expressão booliana válida.
Tipos de retorno
Retorna o tipo de precedência mais alto do conjunto de tipos em result_expressions e a else_result_expression opcional. Para obter mais informações, consulte Precedência de tipo de dados.
Valores retornados
Expressão CASE simples
A expressão simples CASE opera comparando a primeira expressão com a expressão em cada WHEN cláusula para equivalência. Se essas expressões forem equivalentes, a expressão na THEN cláusula será retornada.
Permite somente uma verificação de igualdade.
Na ordem especificada, avalia input_expression = when_expression para cada
WHENcláusula.Retorna o result_expression do primeiro input_expression = when_expression que é avaliado como
TRUE.Se nenhuma input_expression = when_expression for avaliada
TRUE, o Mecanismo de Banco de Dados do SQL Server retornará o else_result_expression se umaELSEcláusula for especificada ou umNULLvalor se nenhumaELSEcláusula for especificada.
Expressão CASE pesquisada
Avalia, na ordem especificada, Boolean_expression para cada
WHENcláusula.Retorna result_expression do primeiro Boolean_expression que é avaliado como
TRUE.Se nenhuma Boolean_expression for avaliada
TRUE, o Mecanismo de Banco de Dados retornará o else_result_expression se umaELSEcláusula for especificada ou umNULLvalor se nenhumaELSEcláusula for especificada.
Remarks
O SQL Server permite apenas 10 níveis de aninhamento em expressões CASE.
A expressão CASE não pode ser usada para controlar o fluxo de execução de instruções Transact-SQL, blocos de instruções, funções definidas pelo usuário e procedimentos armazenados. Para obter uma lista de métodos de controle de fluxo, consulte Control-of-Flow.
A expressão CASE avalia suas condições em sequência e para com a primeira condição satisfatória. Em algumas situações, uma expressão é avaliada antes de uma expressãoCASE receber os resultados da expressão como sua entrada. É possível que haja erros na avaliação dessas expressões. As expressões de agregação que aparecem em WHEN argumentos para uma CASE expressão são avaliadas primeiro e, em seguida, fornecidas à CASE expressão. Por exemplo, a consulta a seguir produz uma divisão por erro zero ao produzir o valor da MAX agregação. Esta etapa ocorre antes de avaliar a CASE expressão.
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
Você só deve depender da ordem de avaliação das WHEN condições para expressões escalares (incluindo subconsultas não relacionadas que retornam escalares), não para expressões de agregação.
Você também deve garantir que pelo menos uma das expressões nas THEN cláusulas ou ELSE cláusulas não seja a NULL constante. Embora NULL possa ser retornado de várias expressões de resultado, nem todas elas podem ser explicitamente a NULL constante. Se todas as expressões de resultado usarem a constante, o NULL erro 8133 será retornado.
Examples
Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que você pode baixar na página inicial Microsoft SQL Server Samples and Community Projects.
A. Usar uma instrução SELECT com uma expressão CASE simples
Dentro de uma instrução SELECT, uma expressão CASE simples é permitida somente para uma verificação de igualdade; nenhuma outra comparação é feita. O exemplo a seguir usa a expressão CASE para alterar a exibição de categorias de linhas de produto para torná-las mais compreensíveis.
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. Usar uma instrução SELECT com uma expressão CASE pesquisada
Dentro de uma instrução SELECT, a expressão CASE pesquisada é permitida para valores a serem substituídos no conjunto de resultados com base nos valores de comparação. O exemplo a seguir exibe o preço da lista como um comentário de texto com base na faixa de preços de um produto.
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. Usar CASE em uma cláusula ORDER BY
Os exemplos a seguir usam a CASE expressão em uma ORDER BY cláusula para determinar a ordem de classificação das linhas com base em um determinado valor de coluna. No primeiro exemplo, é avaliado o valor da coluna SalariedFlag da tabela HumanResources.Employee. Funcionários que têm o SalariedFlag definido como 1 são retornados pelo BusinessEntityID em ordem decrescente. Funcionários que têm o SalariedFlag definido como 0 são retornados pelo BusinessEntityID em ordem crescente.
SELECT BusinessEntityID,
SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag
WHEN 1 THEN BusinessEntityID
END DESC,
CASE
WHEN SalariedFlag = 0 THEN BusinessEntityID
END;
GO
No segundo exemplo, o conjunto de resultados será ordenado pela coluna TerritoryName quando a coluna CountryRegionName for igual a 'United States' e por CountryRegionName para todas as outras linhas.
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. Usar CASE em uma instrução UPDATE
O exemplo a seguir usa a CASE expressão em uma instrução UPDATE para determinar o valor definido para a coluna VacationHours para funcionários com SalariedFlag definido como 0. Ao subtrair 10 horas dos resultados de VacationHours em um valor negativo, VacationHours é aumentado em 40 horas; caso contrário, VacationHours é aumentado em 20 horas. A OUTPUT cláusula é usada para exibir os valores de antes e depois das férias.
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. Usar CASE em uma instrução SET
O exemplo a seguir usa a CASE expressão em uma SET instrução na função dbo.GetContactInfocom valor de tabela. No banco de dados AdventureWorks2025, todo os dados relacionados com pessoas são armazenados na tabela Person.Person. Por exemplo, a pessoa pode ser um funcionário, representante do fornecedor ou um cliente. A função retorna o nome (FirstName) e o nome da família (LastName) de um determinado BusinessEntityID e o tipo de contato para essa pessoa. A CASE expressão na SET instrução determina o valor a ser exibido para a coluna ContactType com base na existência da BusinessEntityID coluna nas EmployeeVendortabelas ou Customer tabelas.
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. Usar CASE em uma cláusula HAVING
O exemplo a seguir usa a CASE expressão em uma HAVING cláusula para restringir as linhas retornadas pela instrução SELECT . A instrução retorna a taxa horária máxima para cada cargo na tabela HumanResources.Employee. A HAVING cláusula restringe os títulos aos que são mantidos por funcionários assalariados com uma taxa de remuneração máxima superior a 40 dólares, ou funcionários não ativos com uma taxa de pagamento máxima superior a 15 dólares.
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. Usar uma expressão CASE aninhada para categorizar resultados
O exemplo a seguir usa uma expressão aninhada CASE para categorizar produtos com base em ListPrice. Se um preço de lista de produtos exceder 1.000 dólares, é considerado High-end. Os produtos restantes são categorizados em uma expressão aninhada CASE com base em ProductLine e 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;
Exemplos: Azure Synapse Analytics e PDW (Analytics Platform System)
H. Usar uma instrução SELECT com uma expressão CASE
Em uma SELECT instrução, a CASE expressão permite que os valores sejam substituídos no conjunto de resultados com base nos valores de comparação. O exemplo a seguir usa a expressão CASE para alterar a exibição de categorias de linhas de produto para torná-las mais compreensíveis. Quando um valor não existe, o texto Not for sale é exibido.
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. Usar CASE em uma instrução UPDATE
O exemplo a seguir usa a CASE expressão em uma instrução UPDATE para determinar o valor definido para a coluna VacationHours para funcionários com SalariedFlag definido como 0. Ao subtrair 10 horas dos resultados de VacationHours em um valor negativo, VacationHours é aumentado em 40 horas; caso contrário, VacationHours é aumentado em 20 horas.
UPDATE dbo.DimEmployee
SET VacationHours = (
CASE
WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40
ELSE (VacationHours + 20.00)
END
)
WHERE SalariedFlag = 0;
GO