Megosztás a következőn keresztül:


ESET (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)SQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

Kiértékeli a feltételek listáját, és több lehetséges eredménykifejezés egyikét adja vissza.

A CASE kifejezés két formátumot használ:

  • Az egyszerűCASE kifejezés összehasonlít egy kifejezést egy egyszerű kifejezéskészlettel az eredmény meghatározásához.

  • A keresettCASE kifejezés logikai kifejezések halmazát értékeli ki az eredmény meghatározásához.

Mindkét formátum támogatja a választható ELSE argumentumokat.

CASE bármely olyan utasításban vagy záradékban használható, amely lehetővé teszi egy érvényes kifejezés használatát. Használhatja például az olyan utasításokban, mint a , CASESELECT , és UPDATE, és az olyan záradékokban, mint DELETEa , SET, <select_list>, IN, és WHERE.ORDER BYHAVING

Transact-SQL szintaxis konvenciók

Syntax

Szintaxis az SQL Serverhez, az Azure SQL Database-hez és az Azure Synapse Analyticshez.

-- 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

A párhuzamos adattárház szintaxisa.

CASE
     WHEN when_expression THEN result_expression [ ...n ]
     [ ELSE else_result_expression ]
END

Arguments

input_expression

Az egyszerű CASE formátum használatakor kiértékelt kifejezés. input_expression bármely érvényes kifejezés.

MIKOR when_expression

Egy egyszerű kifejezés, amelyhez input_expression az egyszerű CASE formátum használatakor hasonlítjuk össze. when_expression bármilyen érvényes kifejezés. A input_expression és az egyes when_expression adattípusainak azonosnak vagy implicit konverziónak kell lenniük.

RESULT_EXPRESSION

A visszaadott kifejezés, ha input_expression egyenlő, when_expression kiértékeli TRUEazt , vagy Boolean_expression kiértékeli.TRUE az eredménykifejezés bármely érvényes kifejezés.

MÁS else_result_expression

A visszaadott kifejezés, ha nincs összehasonlító művelet kiértékelve.TRUE Ha ez az argumentum nincs megadva, és nem történik összehasonlító művelet kiértékelése TRUE, CASE akkor a függvény a függvényt NULLadja vissza. else_result_expression bármilyen érvényes kifejezés. A else_result_expression és bármely result_expression adattípusának azonosnak kell lennie, vagy implicit konverziónak kell lennie.

MIKOR Boolean_expression

A keresett formátum használatakor kiértékelt CASE logikai kifejezés. Boolean_expression bármely érvényes logikai kifejezés.

Visszatérési típusok

A legmagasabb prioritási típust adja vissza a result_expressions típuskészletéből és az opcionális else_result_expression. További információ: Adattípus elsőbbsége.

Visszaadott értékek

Egyszerű CASE kifejezés

Az egyszerű CASE kifejezés úgy működik, hogy összehasonlítja az első kifejezést az egyes WHEN záradékok kifejezésével az egyenértékűség érdekében. Ha ezek a kifejezések egyenértékűek, a záradékban szereplő THEN kifejezés lesz visszaadva.

  • Csak egyenlőség-ellenőrzést engedélyez.

  • A megadott sorrendben kiértékeli az egyes WHEN záradékok input_expression = when_expression.

  • A kiértékelt első input_expressionwhen_expression = result_expressionTRUEadja vissza.

  • Ha nincs input_expression = when_expression kiértékelése TRUE, az SQL Server adatbázismotorja visszaadja a else_result_expression , ha egy ELSE záradék meg van adva, vagy egy NULL értéket, ha nincs ELSE megadva záradék.

Keresett CASE kifejezés

  • A megadott sorrendben kiértékeli az egyesWHEN záradékok Boolean_expression.

  • A kiértékelt első Boolean_expression result_expressionTRUEadja vissza.

  • Ha nem Boolean_expression kiértékelni TRUE, az adatbázismotor visszaadja a else_result_expression , ha egy ELSE záradék meg van adva, vagy egy NULL értéket, ha nincs ELSE megadva záradék.

Remarks

Az SQL Server csak 10 szintű beágyazást tesz lehetővé a kifejezésekben CASE .

A CASE kifejezés nem használható Transact-SQL utasítások, utasításblokkok, felhasználó által definiált függvények és tárolt eljárások végrehajtásának szabályozására. A folyamatvezérlési módszerek listáját lásd: Control-of-Flow.

A CASE kifejezés egymás után értékeli ki a feltételeket, és az első feltétel teljesülése után leáll. Bizonyos helyzetekben a rendszer kiértékel egy kifejezést, mielőtt a CASE kifejezés bemenetként megkapja a kifejezés eredményeit. A kifejezések kiértékelésével kapcsolatos hibák lehetségesek. A kifejezés argumentumaiban WHENCASE megjelenő összesítő kifejezéseket a rendszer először kiértékeli, majd megadja a CASE kifejezésnek. Az alábbi lekérdezés például nulla hibával való osztást eredményez az MAX aggregátum értékének előállításakor. Ez a lépés a kifejezés kiértékelése CASE előtt történik.

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

Csak a skaláris kifejezések feltételeinek kiértékelési sorrendjétől függhet (beleértve a WHEN skalárokat visszaadó nem korrelált alquerieseket is), az összesített kifejezések esetében nem.

Azt is biztosítania kell, hogy a vagy záradékok THEN legalább egyik kifejezése ne legyen állandóELSE.NULL Bár NULL több eredménykifejezésből is visszaadható, nem mindegyik lehet explicit módon állandó NULL . Ha az összes eredménykifejezés az állandót használja, a NULL 8133-as hiba jelenik meg.

Examples

A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.

A. SELECT utasítás használata egyszerű CASE kifejezéssel

SELECT Egy állításon belül egy egyszerű CASE kifejezés csak egyenlőség-ellenőrzést tesz lehetővé, más összehasonlítást nem végez. Az alábbi példa a CASE kifejezéssel módosítja a terméksor-kategóriák megjelenítését, hogy érthetőbbek legyenek.

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 utasítás használata keresendő CASE-kifejezéssel

SELECT Egy utasításon belül a keresett CASE kifejezés lehetővé teszi az értékek cseréjét az eredményhalmazban az összehasonlítási értékek alapján. Az alábbi példa szöveges megjegyzésként jeleníti meg a listaárat egy termék ártartománya alapján.

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 használata ORDER BY záradékban

Az alábbi példák egy CASE záradék kifejezésével ORDER BY határozzák meg a sorok rendezési sorrendjét egy adott oszlopérték alapján. Az első példában a tábla oszlopában SalariedFlag lévő HumanResources.Employee érték kiértékelése történik. SalariedFlag Az 1 értékű alkalmazottakat csökkenő sorrendben adja vissza a BusinessEntityID rendszer. SalariedFlag A 0 értékre beállított alkalmazottakat növekvő sorrendben adja vissza a BusinessEntityID rendszer.

SELECT BusinessEntityID,
    SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag
        WHEN 1 THEN BusinessEntityID
        END DESC,
    CASE
        WHEN SalariedFlag = 0 THEN BusinessEntityID
        END;
GO

A második példában az eredményhalmazt az oszlop TerritoryName rendezi, ha az oszlop CountryRegionName egyenlő az "Egyesült Államok" és CountryRegionName az összes többi sor esetében.

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. A CASE használata update utasításban

Az alábbi példa egy CASEUPDATE utasításban szereplő kifejezéssel határozza meg a 0-ra VacationHours beállított alkalmazottak oszlopának SalariedFlag értékét. Ha 10 órát kivon a negatív érték eredményéből VacationHours , VacationHours 40 órával nő, ellenkező esetben VacationHours 20 órával nő. A OUTPUT záradék a szabadság előtti és utáni értékek megjelenítésére szolgál.

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. A CASE használata SET utasításban

Az alábbi példa a CASE táblaértékelt függvény SETegyik dbo.GetContactInfo utasításában szereplő kifejezést használja. Az adatbázisban a AdventureWorks2025 rendszer a személyekhez kapcsolódó összes adatot a Person.Person táblában tárolja. A személy lehet például alkalmazott, szállítói képviselő vagy ügyfél. A függvény egy adott FirstName személy utónevét (LastName) és családnevét (BusinessEntityID) adja vissza, valamint az adott személy kapcsolattartási típusát. Az CASE utasításban szereplő SET kifejezés határozza meg az oszlop ContactType megjelenítendő értékét a , BusinessEntityIDvagy Employee táblák oszlopának VendorCustomermeglétén alapulva.

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. A CASE használata a HAVING záradékban

Az alábbi példa egy CASE záradék kifejezésével HAVING korlátozza az utasítás által SELECT visszaadott sorokat. Az utasítás a táblázatban szereplő összes feladatcím óradíját HumanResources.Employee adja vissza. A HAVING záradék azokra a címekre korlátozza a címeket, amelyeket a 40 dollárnál nagyobb maximális bérmértékkel rendelkező alkalmazottak, illetve a 15 dollárnál nagyobb maximális fizetési rátával rendelkező, nem szalariáns alkalmazottak birtokolnak.

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. Beágyazott CASE-kifejezés használata az eredmények kategorizálásához

Az alábbi példa beágyazott CASE kifejezéssel kategorizálja a termékeket az alapján ListPrice. Ha egy terméklista ára meghaladja az 1000 dollárt, akkor a rendszer figyelembe veszi High-end. A fennmaradó termékek egy beágyazott CASE kifejezésbe vannak kategorizálva a ProductLine következők alapján: és 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;

Példák: Azure Synapse Analytics and Analytics Platform System (PDW)

H. SELECT utasítás használata CASE kifejezéssel

SELECT Egy utasításon belül a CASE kifejezés lehetővé teszi az értékek cseréjét az eredményhalmazban az összehasonlítási értékek alapján. Az alábbi példa a CASE kifejezéssel módosítja a terméksor-kategóriák megjelenítését, hogy érthetőbbek legyenek. Ha egy érték nem létezik, megjelenik a szöveg 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. A CASE használata update utasításban

Az alábbi példa egy CASEUPDATE utasításban szereplő kifejezéssel határozza meg a 0-ra VacationHours beállított alkalmazottak oszlopának SalariedFlag értékét. Ha 10 órát kivon a negatív érték eredményéből VacationHours , VacationHours 40 órával nő, ellenkező esetben VacationHours 20 órával nő.

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