Partilhar via


CAIXA (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseInstância Gerida do Azure SQLAzure Synapse AnalyticsSistema de Plataforma Analítica (PDW)Ponto de extremidade de análise SQL no Microsoft FabricWarehouse no Microsoft FabricBanco de dados SQL no Microsoft Fabric Preview

Avalia uma lista de condições e retorna uma das várias expressões de resultado possíveis.

A CASE expressão tem dois formatos:

  • A expressão simplesCASE compara uma expressão a um conjunto de expressões simples para determinar o resultado.

  • A expressão pesquisadaCASE avalia um conjunto de expressões booleanas para determinar o resultado.

Ambos os formatos suportam um argumento opcional ELSE .

CASE pode ser usado em qualquer declaração ou cláusula que permita uma expressão válida. Por exemplo, você pode usar CASE em instruções como SELECT, DELETEUPDATEe , e SETem cláusulas como <select_list>, IN, WHERE, ORDER BY, e HAVING.

Transact-SQL convenções de sintaxe

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 para 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 simples CASE é usado. input_expression é qualquer expressão válida.

QUANDO when_expression

Uma expressão simples com a qual input_expression é comparado quando o formato simples CASE é 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.

ENTÃO result_expression

A expressão retornada quando input_expression é igual a when_expression avalia a TRUE, ou Boolean_expression avalia a TRUE. expressão de resultado é qualquer expressão válida.

ELSE 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 quaisquer result_expression devem ser os mesmos ou devem ser uma conversão implícita.

QUANDO Boolean_expression

A expressão booleana avaliada ao usar o formato pesquisado CASE . Boolean_expression é qualquer expressão booleana válida.

Tipos de devolução

Retorna o tipo de precedência mais alta do conjunto de tipos em result_expressions e o else_result_expression opcional. Para obter mais informações, consulte Precedência de tipo de dados.

Valores de retorno

Expressão CASE simples

A expressão simples CASE opera comparando a primeira expressão com a expressão de cada WHEN cláusula de equivalência. Se essas expressões forem equivalentes, a expressão na THEN cláusula será retornada.

  • Permite apenas uma verificação de igualdade.

  • Na ordem especificada, avalia input_expression = when_expression para cada WHEN cláusula.

  • Retorna o result_expression do primeiro input_expression when_expression = que é avaliado como .TRUE

  • Se nenhuma input_expression = when_expression for avaliada como TRUE, o Mecanismo de Banco de Dados do SQL Server retornará o else_result_expression se uma ELSE cláusula for especificada ou um NULL valor se nenhuma ELSE cláusula for especificada.

Expressão CASE pesquisada

  • Avalia, na ordem especificada, Boolean_expression para cada WHEN cláusula.

  • Retorna result_expression do primeiro Boolean_expression que é avaliado como TRUE.

  • Se nenhum Boolean_expression for avaliado como TRUE, o Mecanismo de Banco de Dados retornará o else_result_expression se uma ELSE cláusula for especificada ou um NULL valor se nenhuma ELSE cláusula for especificada.

Remarks

O SQL Server permite apenas 10 níveis de aninhamento em CASE expressões.

A CASE expressão 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 Controle de fluxo.

A CASE expressão avalia suas condições sequencialmente e para com a primeira condição cuja condição é satisfeita. Em algumas situações, uma expressão é avaliada antes de receber CASE os resultados da expressão como entrada. Erros na avaliação dessas expressões são possíveis. As expressões agregadas que aparecem em argumentos para uma CASE expressão são avaliadas primeiro e, em WHEN seguida, fornecidas à CASE expressão. Por exemplo, a consulta a seguir produz um erro de divisão por 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ê deve depender apenas da WHEN ordem de avaliação das condições para expressões escalares (incluindo subconsultas não correlacionadas que retornam escalares), não para expressões agregadas.

Você também deve garantir que pelo menos uma das expressões nas THEN cláusulas ou ELSE não seja a NULL constante. Embora NULL possam ser retornados 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 AdventureWorks2022 ou AdventureWorksDW2022, que pode ser descarregado da página inicial de Exemplos e Projetos da Comunidade do Microsoft SQL Server.

A. Use uma instrução SELECT com uma expressão CASE simples

Dentro de uma SELECT declaração, uma CASE simples expressão permite apenas uma verificação de igualdade, não sendo feitas outras comparações. O exemplo a seguir usa a CASE expressão para alterar a exibição de categorias de linha de produtos 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 SELECT instrução, a expressão pesquisada CASE permite que os valores sejam substituídos no conjunto de resultados com base em valores de comparação. O exemplo a seguir exibe o preço de tabela 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. Use 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, o valor na SalariedFlag coluna da HumanResources.Employee tabela é avaliado. Os funcionários que têm o SalariedFlag conjunto como 1 são devolvidos em ordem BusinessEntityID pela ordem decrescente. Os funcionários que têm o SalariedFlag conjunto como 0 são devolvidos em ordem BusinessEntityID crescente pela 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 é ordenado pela coluna TerritoryName quando a coluna CountryRegionName é igual a 'Estados Unidos' e por CountryRegionName 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. Use CASE em uma instrução UPDATE

O exemplo a seguir usa a CASE expressão em uma UPDATE instrução para determinar o valor definido para a coluna VacationHours para funcionários com SalariedFlag definido como 0. Ao subtrair 10 horas de VacationHours resultados 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 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. Use 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 . AdventureWorks2022 No banco de dados, todos os dados relacionados a pessoas são armazenados na Person.Person tabela. Por exemplo, a pessoa pode ser um funcionário, representante do fornecedor ou um cliente. A função retorna o primeiro nome (FirstName) e o nome de família (LastName) de um determinado BusinessEntityID e o tipo de contato dessa 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 Employeetabelas , Vendorou 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. Use 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 SELECT instrução. A instrução retorna a taxa horária para cada cargo na HumanResources.Employee tabela. A HAVING cláusula restringe os títulos àqueles que são detidos por empregados assalariados com uma taxa de remuneração máxima superior a 40 dólares, ou empregados não assalariados com uma taxa de remuneração 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 os resultados

O exemplo a seguir usa uma expressão aninhada CASE para categorizar produtos com base em ListPrice. Se o preço de tabela de um produto 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 and Analytics Platform System (PDW)

H. Usar uma instrução SELECT com uma expressão CASE

Dentro de uma SELECT instrução, a CASE expressão permite que os valores sejam substituídos no conjunto de resultados com base em valores de comparação. O exemplo a seguir usa a CASE expressão para alterar a exibição de categorias de linha de produtos 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. Use CASE em uma instrução UPDATE

O exemplo a seguir usa a CASE expressão em uma UPDATE instrução para determinar o valor definido para a coluna VacationHours para funcionários com SalariedFlag definido como 0. Ao subtrair 10 horas de VacationHours resultados 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