Udostępnij za pomocą


SPRAWA (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricHurtownia danych w usłudze Microsoft FabricBaza 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 prosteCASE porównuje wyrażenie z zestawem wyrażeń prostych w celu określenia wyniku.

  • WyszukiwaneCASE wyraż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 WHEN klauzuli.

  • Zwraca result_expression pierwszego input_expression when_expression = , który daje wartość .TRUE

  • Jeśli żaden input_expression when_expression = nie zwróciTRUEwartości , aparat bazy danych programu SQL Server zwraca else_result_expression, jeśli określono klauzulę ELSENULL, lub wartość, jeśli nie ELSE określono żadnej klauzuli.

Przeszukane wyrażenie CASE

  • Oblicza w podanej kolejności Boolean_expression dla każdej WHEN klauzuli.

  • Zwraca result_expression pierwszego Boolean_expression, który daje wartość .TRUE

  • Jeśli żadna Boolean_expression nie zwróci TRUEwartości , aparat bazy danych zwróci else_result_expression , jeśli określono klauzulę ELSENULL lub wartość, jeśli nie ELSE okreś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