Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
Azure Synapse Analytics
Elemzési platformrendszer (PDW)
SQL Analytics-végpont a Microsoft Fabricben
Raktár a Microsoft Fabricben
SQL-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ű
CASEkifejezés összehasonlít egy kifejezést egy egyszerű kifejezéskészlettel az eredmény meghatározásához.A keresett
CASEkifejezé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
WHENzáradékok input_expression = when_expression.A kiértékelt első input_expressionwhen_expression = result_expression
TRUEadja vissza.Ha nincs input_expression = when_expression kiértékelése
TRUE, az SQL Server adatbázismotorja visszaadja a else_result_expression , ha egyELSEzáradék meg van adva, vagy egyNULLértéket, ha nincsELSEmegadva záradék.
Keresett CASE kifejezés
A megadott sorrendben kiértékeli az egyes
WHENzáradékok Boolean_expression.A kiértékelt első Boolean_expression result_expression
TRUEadja vissza.Ha nem Boolean_expression kiértékelni
TRUE, az adatbázismotor visszaadja a else_result_expression , ha egyELSEzáradék meg van adva, vagy egyNULLértéket, ha nincsELSEmegadva 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