CASE (Transact-SQL)CASE (Transact-SQL)

APLICA-SE A: simSQL Server (a partir do 2008) simBanco de Dados SQL do Azure simSQL Data Warehouse do Azure simParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Avalia uma lista de condições e retorna uma das várias expressões de resultado possíveis.Evaluates a list of conditions and returns one of multiple possible result expressions.

A expressão CASE tem dois formatos:The CASE expression has two formats:

  • A expressão CASE simples compara uma expressão com um conjunto de expressões simples para determinar o resultado.The simple CASE expression compares an expression to a set of simple expressions to determine the result.

  • A expressão CASE pesquisada avalia um conjunto de expressões boolianas para determinar o resultado.The searched CASE expression evaluates a set of Boolean expressions to determine the result.

Os dois formatos dão suporte a um argumento ELSE opcional.Both formats support an optional ELSE argument.

CASE pode ser usada em qualquer instrução ou cláusula que permita uma expressão válida.CASE can be used in any statement or clause that allows a valid expression. Por exemplo, você pode usar CASE em instruções, como SELECT, UPDATE, DELETE e SET, e em cláusulas, como select_list, IN, WHERE, ORDER BY e HAVING.For example, you can use CASE in statements such as SELECT, UPDATE, DELETE and SET, and in clauses such as select_list, IN, WHERE, ORDER BY, and HAVING.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

-- Syntax for SQL Server and Azure SQL Database  
  
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 for Azure SQL Data Warehouse and Parallel Data Warehouse  
  
CASE  
     WHEN when_expression THEN result_expression [ ...n ]   
     [ ELSE else_result_expression ]   
END  

ArgumentosArguments

input_expressioninput_expression
É a expressão avaliada quando o formato CASE simples é usado.Is the expression evaluated when the simple CASE format is used. input_expression é qualquer expression válida.input_expression is any valid expression.

WHEN when_expressionWHEN when_expression
É uma expressão simples com a qual input_expression é comparada quando o formato CASE simples é usado.Is a simple expression to which input_expression is compared when the simple CASE format is used. when_expression é qualquer expressão válida.when_expression is any valid expression. Os tipos de dados de input_expression e cada when_expression devem ser os mesmos ou devem ser uma conversão implícita.The data types of input_expression and each when_expression must be the same or must be an implicit conversion.

THEN result_expressionTHEN result_expression
É a expressão retornada quando input_expression igual a when_expression é avaliada como TRUE ou Boolean_expression é avaliada como TRUE.Is the expression returned when input_expression equals when_expression evaluates to TRUE, or Boolean_expression evaluates to TRUE. result expression é qualquer expression válida.result expression is any valid expression.

ELSE else_result_expressionELSE else_result_expression
É a expressão retornada se nenhuma operação de comparação for avaliada como TRUE.Is the expression returned if no comparison operation evaluates to TRUE. Se esse argumento for omitido e nenhuma operação de comparação for avaliada como TRUE, CASE retornará NULL.If this argument is omitted and no comparison operation evaluates to TRUE, CASE returns NULL. else_result_expression é qualquer expressão válida.else_result_expression is any valid expression. Os tipos de dados de else_result_expression e qualquer result_expression devem ser os mesmos ou devem ser uma conversão implícita.The data types of else_result_expression and any result_expression must be the same or must be an implicit conversion.

WHEN Boolean_expressionWHEN Boolean_expression
É a expressão booliana avaliada quando o formato CASE simples é usado.Is the Boolean expression evaluated when using the searched CASE format. Boolean_expression é qualquer expressão booliana válida.Boolean_expression is any valid Boolean expression.

Tipos de retornoReturn Types

Retorna o tipo de precedência mais alto do conjunto de tipos em result_expressions e a else_result_expression opcional.Returns the highest precedence type from the set of types in result_expressions and the optional else_result_expression. Para obter mais informações, veja Precedência de tipo de dados (Transact-SQL).For more information, see Data Type Precedence (Transact-SQL).

Valores de retornoReturn Values

Expressão CASE simples:Simple CASE expression:

A expressão CASE simples opera comparando a primeira expressão com a expressão em cada cláusula WHEN por equivalência.The simple CASE expression operates by comparing the first expression to the expression in each WHEN clause for equivalency. Se essas expressões forem equivalentes, a expressão na cláusula THEN será retornada.If these expressions are equivalent, the expression in the THEN clause will be returned.

  • Permite somente uma verificação de igualdade.Allows only an equality check.

  • Na ordem especificada, avalia input_expression = when_expression para cada cláusula WHEN.In the order specified, evaluates input_expression = when_expression for each WHEN clause.

  • Retorna a result_expression da primeira input_expression = when_expression que é avaliada como TRUE.Returns the result_expression of the first input_expression = when_expression that evaluates to TRUE.

  • Se nenhuma input_expression = when_expression for avaliada como TRUE, o Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine retornará a else_result_expression, caso uma cláusula ELSE tenha sido especificada, ou um valor NULL, caso nenhuma cláusula ELSE tenha sido especificada.If no input_expression = when_expression evaluates to TRUE, the Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine returns the else_result_expression if an ELSE clause is specified, or a NULL value if no ELSE clause is specified.

Expressão CASE pesquisada:Searched CASE expression:

  • Avalia, na ordem especificada, a Boolean_expression de cada cláusula WHEN.Evaluates, in the order specified, Boolean_expression for each WHEN clause.

  • Retorna result_expression da primeira Boolean_expression que é avaliada como TRUE.Returns result_expression of the first Boolean_expression that evaluates to TRUE.

  • Se nenhuma Boolean_expression for avaliada como TRUE, o Mecanismo de Banco de DadosDatabase Engine retornará a else_result_expression, caso uma cláusula ELSE tenha sido especificada, ou um valor NULL, caso nenhuma cláusula ELSE tenha sido especificada.If no Boolean_expression evaluates to TRUE, the Mecanismo de Banco de DadosDatabase Engine returns the else_result_expression if an ELSE clause is specified, or a NULL value if no ELSE clause is specified.

RemarksRemarks

O SQL ServerSQL Server permite apenas 10 níveis de aninhamento em expressões CASE.SQL ServerSQL Server allows for only 10 levels of nesting in CASE expressions.

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.The CASE expression cannot be used to control the flow of execution of Transact-SQL statements, statement blocks, user-defined functions, and stored procedures. Para obter uma lista dos métodos de controle de fluxo, consulte Linguagem de controle de fluxo (Transact-SQL).For a list of control-of-flow methods, see Control-of-Flow Language (Transact-SQL).

A expressão CASE avalia suas condições em sequência e para com a primeira condição satisfatória.The CASE expression evaluates its conditions sequentially and stops with the first condition whose condition is satisfied. Em algumas situações, uma expressão é avaliada antes de uma expressão CASE receber os resultados da expressão como sua entrada.In some situations, an expression is evaluated before a CASE expression receives the results of the expression as its input. É possível que haja erros na avaliação dessas expressões.Errors in evaluating these expressions are possible. As expressões agregadas que aparecem em argumentos WHEN de uma expressão CASE são avaliadas primeiro e, em seguida, são fornecidas para a expressão CASE.Aggregate expressions that appear in WHEN arguments to a CASE expression are evaluated first, then provided to the CASE expression. Por exemplo, a seguinte consulta gera um erro de divisão por zero ao gerar o valor da agregação MAX.For example, the following query produces a divide by zero error when producing the value of the MAX aggregate. Isso ocorre antes da avaliação da expressão CASE.This occurs prior to evaluating the CASE expression.

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 ;  

Você deve depender somente da ordem de avaliação das condições WHEN para expressões escalares (incluindo subconsultas não correlacionadas que retornam escalares), e não para expressões agregadas.You should only depend on order of evaluation of the WHEN conditions for scalar expressions (including non-correlated sub-queries that return scalars), not for aggregate expressions.

ExemplosExamples

A.A. Usando uma instrução SELECT com uma expressão CASE simplesUsing a SELECT statement with a simple CASE expression

Dentro de uma instrução SELECT, uma expressão CASE simples é permitida somente para uma verificação de igualdade; nenhuma outra comparação é feita.Within a SELECT statement, a simple CASE expression allows for only an equality check; no other comparisons are made. 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.The following example uses the CASE expression to change the display of product line categories to make them more understandable.

USE AdventureWorks2012;  
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.B. Usando uma instrução SELECT com uma expressão CASE pesquisadaUsing a SELECT statement with a searched CASE expression

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.Within a SELECT statement, the searched CASE expression allows for values to be replaced in the result set based on comparison values. 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.The following example displays the list price as a text comment based on the price range for a product.

USE AdventureWorks2012;  
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.C. Usando CASE em uma cláusula ORDER BYUsing CASE in an ORDER BY clause

O exemplo a seguir usa a expressão CASE em uma cláusula ORDER BY para determinar a ordem de classificação das linhas com base no valor da coluna fornecido.The following examples uses the CASE expression in an ORDER BY clause to determine the sort order of the rows based on a given column value. No primeiro exemplo, é avaliado o valor da coluna SalariedFlag da tabela HumanResources.Employee.In the first example, the value in the SalariedFlag column of the HumanResources.Employee table is evaluated. Funcionários que têm o SalariedFlag definido como 1 são retornados pelo BusinessEntityID em ordem decrescente.Employees that have the SalariedFlag set to 1 are returned in order by the BusinessEntityID in descending order. Funcionários que têm o SalariedFlag definido como 0 são retornados pelo BusinessEntityID em ordem crescente.Employees that have the SalariedFlag set to 0 are returned in order by the BusinessEntityID in ascending order. 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.In the second example, the result set is ordered by the column TerritoryName when the column CountryRegionName is equal to 'United States' and by CountryRegionName for all other rows.

SELECT BusinessEntityID, SalariedFlag  
FROM HumanResources.Employee  
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC  
        ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;  
GO  
  
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;  
  

D.D. Usando CASE em uma instrução UPDATEUsing CASE in an UPDATE statement

O exemplo a seguir usa a expressão CASE em uma instrução UPDATE para determinar o valor definido para a coluna VacationHours para funcionários com SalariedFlag definido como 0.The following example uses the CASE expression in an UPDATE statement to determine the value that is set for the column VacationHours for employees with SalariedFlag set to 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.When subtracting 10 hours from VacationHours results in a negative value, VacationHours is increased by 40 hours; otherwise, VacationHours is increased by 20 hours. A cláusula OUTPUT é usada para exibir os valores de antes e depois das férias.The OUTPUT clause is used to display the before and after vacation values.

USE AdventureWorks2012;  
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;  
  

E.E. Usando CASE em uma instrução SETUsing CASE in a SET statement

O exemplo a seguir usa a expressão CASE em uma instrução SET na função com valor de tabela dbo.GetContactInfo.The following example uses the CASE expression in a SET statement in the table-valued function dbo.GetContactInfo. No banco de dados AdventureWorks2012AdventureWorks2012, todo os dados relacionados com pessoas são armazenados na tabela Person.Person.In the AdventureWorks2012AdventureWorks2012 database, all data related to people is stored in the Person.Person table. Por exemplo, a pessoa pode ser um funcionário, um representante de fornecedor ou um cliente.For example, the person may be an employee, vendor representative, or a customer. A função retorna o nome e o sobrenome de determinado BusinessEntityID e o tipo de contato dessa pessoa. A expressão CASE na instrução SET determina o valor a ser exibido para a coluna ContactType com base na existência da coluna BusinessEntityID nas tabelas Employee, Vendor ou Customer.The function returns the first and last name of a given BusinessEntityID and the contact type for that person.The CASE expression in the SET statement determines the value to display for the column ContactType based on the existence of the BusinessEntityID column in the Employee, Vendor, or Customer tables.

  
USE AdventureWorks2012;  
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);  
  

F.F. Usando CASE em uma cláusula HAVINGUsing CASE in a HAVING clause

O exemplo a seguir usa a expressão CASE em uma cláusula HAVING para restringir as linhas retornadas pela instrução SELECT.The following example uses the CASE expression in a HAVING clause to restrict the rows returned by the SELECT statement. A instrução retorna a taxa horária máxima para cada cargo na tabela HumanResources.Employee.The statement returns the maximum hourly rate for each job title in the HumanResources.Employee table. A cláusula HAVING restringe os títulos aos que são mantidos por homens com uma taxa de pagamento máxima maior que 40 dólares ou por mulheres com uma taxa de pagamento máxima maior que 42 dólares.The HAVING clause restricts the titles to those that are held by men with a maximum pay rate greater than 40 dollars or women with a maximum pay rate greater than 42 dollars.

USE AdventureWorks2012;  
GO  
SELECT JobTitle, MAX(ph1.Rate)AS MaximumRate  
FROM HumanResources.Employee AS e  
JOIN HumanResources.EmployeePayHistory AS ph1 ON e.BusinessEntityID = ph1.BusinessEntityID  
GROUP BY JobTitle  
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;  
  

Exemplos: Azure SQL Data WarehouseAzure SQL Data Warehouse e Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

G.G. Usando uma instrução SELECT com uma expressão CASEUsing a SELECT statement with a CASE expression

Dentro de uma instrução SELECT, a expressão CASE permite que os valores sejam substituídos no conjunto de resultados com base nos valores de comparação.Within a SELECT statement, the CASE expression allows for values to be replaced in the result set based on comparison values. O exemplo a seguir usa a expressão CASE para alterar a exibição de categorias de linhas de produtos a fim de torná-las mais compreensíveis.The following example uses the CASE expression to change the display of product line categories to make them more understandable. Quando um valor não existe, o texto "Não destinado à venda" é exibido.When a value does not exist, the text "Not for sale' is displayed.

-- Uses AdventureWorks  
  
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;  

H.H. Usando CASE em uma instrução UPDATEUsing CASE in an UPDATE statement

O exemplo a seguir usa a expressão CASE em uma instrução UPDATE para determinar o valor definido para a coluna VacationHours para funcionários com SalariedFlag definido como 0.The following example uses the CASE expression in an UPDATE statement to determine the value that is set for the column VacationHours for employees with SalariedFlag set to 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.When subtracting 10 hours from VacationHours results in a negative value, VacationHours is increased by 40 hours; otherwise, VacationHours is increased by 20 hours.

-- Uses AdventureWorks   
  
UPDATE dbo.DimEmployee  
SET VacationHours =   
    ( CASE  
         WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40  
         ELSE (VacationHours + 20.00)   
       END  
    )   
WHERE SalariedFlag = 0;  
  

Consulte TambémSee Also

Expressões (Transact-SQL) Expressions (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
COALESCE (Transact-SQL) COALESCE (Transact-SQL)
IIF (Transact-SQL) IIF (Transact-SQL)
CHOOSE (Transact-SQL)CHOOSE (Transact-SQL)