Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Azure Synapse Analytics
Analiz Platformu Sistemi (PDW)
Microsoft Fabric'teki SQL analiz uç noktası
Microsoft Fabric'teki ambar
Microsoft Fabric'teki SQL veritabanı
Koşulların listesini değerlendirir ve birden çok olası sonuç ifadelerinden birini döndürür.
İfadenin CASE iki biçimi vardır:
Basit
CASEifade, sonucu belirlemek için bir ifadeyi bir dizi basit ifadeyle karşılaştırır.Arama yapılan
CASEifade sonucu belirlemek için bir Boole ifadeleri kümesini değerlendirir.
Her iki biçim de isteğe bağlı ELSE bağımsız değişkeni destekler.
CASE geçerli bir ifadeye izin veren herhangi bir deyim veya yan tümcede kullanılabilir. Örneğin, , CASESELECT ve gibi UPDATEdeyimlerde ve DELETE, SET, <select_list>, INve WHEREgibi ORDER BYyan tümcelerde kullanabilirsinizHAVING.
Transact-SQL söz dizimi kuralları
Syntax
SQL Server, Azure SQL Veritabanı ve Azure Synapse Analytics için söz dizimi.
-- 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
Paralel Veri Ambarı söz dizimi.
CASE
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
Arguments
input_expression
İfade, basit CASE biçim kullanıldığında değerlendirilir.
input_expression herhangi bir geçerli ifadedir.
NE ZAMAN when_expression
Basit biçim kullanıldığında input_expression karşılaştırıldığı basit CASE bir ifade.
when_expression herhangi bir geçerli ifadedir.
input_expression ve her when_expression veri türleri aynı veya örtük dönüştürme olmalıdır.
SONRA result_expression
input_expression eşit olduğunda döndürülen ifade when_expression olarak değerlendirilir TRUEveya Boolean_expression olarak değerlendirilirTRUE.
sonuç ifadesi herhangi bir geçerli ifadedir.
ELSE else_result_expression
Karşılaştırma işlemi olarak değerlendirilmezse TRUEdöndürülen ifade. Bu bağımsız değişken atlanırsa ve hiçbir karşılaştırma işlemi olarak değerlendirilmezse TRUEdöndürür CASENULL.
else_result_expression herhangi bir geçerli ifadedir.
else_result_expression veri türleri ve herhangi bir result_expression aynı veya örtük bir dönüştürme olmalıdır.
NE ZAMAN Boolean_expression
Aranan CASE biçim kullanılırken değerlendirilen Boole ifadesi.
Boolean_expression geçerli bir Boole ifadesidir.
Dönüş türleri
result_expressions ve isteğe bağlıelse_result_expression tür kümesinden en yüksek öncelik türünü döndürür. Daha fazla bilgi için bkz. Veri türü önceliği.
Dönüş değerleri
Basit CASE ifadesi
Basit CASE ifade, ilk ifadeyi denklik için her WHEN yan tümcedeki ifadeyle karşılaştırarak çalışır. Bu ifadeler eşdeğerse yan tümcesindeki THEN ifade döndürülür.
Yalnızca eşitlik denetimine izin verir.
Belirtilen sırada, her
WHENyan tümce için input_expression = when_expression değerlendirir.olarak değerlendirilenilk =
TRUEdöndürür.when_expression = input_expression belirtilmezse
TRUE, SQL Server Veritabanı Altyapısı bir yan tümce belirtilirseELSEveya yan tümce belirtilmezseNULLbirELSEdeğer döndürür.
Aranan BÜYÜK/KÜÇÜK HARF ifadesi
Her yan tümce için belirtilen sırada
WHENdeğerlendirir.olarak değerlendirilen ilk Boolean_expression result_expression
TRUEBoolean_expression belirtilmezse
TRUE, Veritabanı Altyapısı bir yan tümce belirtilirseELSEveya yanNULLtümce belirtilmezse birELSEdeğer döndürür.
Remarks
SQL Server, ifadelerde CASE yalnızca 10 düzey iç içe yerleştirmeye izin verir.
İfade, CASE Transact-SQL deyimlerinin, deyim bloklarının, kullanıcı tanımlı işlevlerin ve saklı yordamların yürütme akışını denetlemek için kullanılamaz. Akış denetimi yöntemlerinin listesi için bkz. Akış Denetimi.
İfade, CASE koşullarını sıralı olarak değerlendirir ve koşulu karşılanan ilk koşulla durur. Bazı durumlarda, bir ifade, ifadenin sonuçlarını girişi olarak almadan önce CASE değerlendirilir. Bu ifadeleri değerlendirme hataları mümkündür. bir WHEN ifadenin bağımsız değişkenlerinde CASE görünen toplama ifadeleri önce değerlendirilir, ardından ifadeye CASE sağlanır. Örneğin, aşağıdaki sorgu toplama değerini MAX üretirken sıfıra bölme hatası oluşturur. Bu adım, ifadeyi CASE değerlendirmeden önce gerçekleşir.
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
Toplama ifadeleri için değil, yalnızca skaler ifadeler için koşulların WHEN (skaler döndüren bağıntısız alt sorgular dahil) değerlendirilme sırasına bağlı olmanız gerekir.
Ayrıca, or THEN yan tümcelerindeki ELSE ifadelerden en az birinin sabit olmadığından NULL emin olmanız gerekir. Birden çok sonuç ifadesinden döndürülebilir ancak NULL bunların tümü açıkça sabit olamaz NULL . Tüm sonuç ifadeleri sabiti NULL kullanırsa, hata 8133 döndürülür.
Examples
Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.
A. Basit bir CASE ifadesiyle SELECT deyimi kullanma
Bir SELECT deyim içinde, basit CASE bir ifade yalnızca eşitlik denetimine izin verir; başka karşılaştırma yapılmaz. Aşağıdaki örnek, ürün satırı kategorilerinin görünümünü değiştirerek daha anlaşılır hale getirmek için ifadesini kullanır CASE .
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. Aranan CASE ifadesiyle SELECT deyimi kullanma
Bir SELECT deyim içinde, aranan CASE ifade karşılaştırma değerlerine göre sonuç kümesinde değerlerin değiştirilmesini sağlar. Aşağıdaki örnek, bir ürünün fiyat aralığını temel alan bir metin açıklaması olarak liste fiyatını görüntüler.
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. ORDER BY yan tümcesinde CASE kullanma
Aşağıdaki örnekler, belirli bir CASE sütun değerine göre satırların sıralama düzenini belirlemek için yan tümcesindeki ifadeyi kullanırORDER BY. İlk örnekte, tablonun sütunundaki SalariedFlagHumanResources.Employee değer değerlendirilir.
SalariedFlag 1 olarak ayarlanmış çalışanlar azalan düzende sırasıyla BusinessEntityID döndürülür.
SalariedFlag 0 olarak ayarlanmış çalışanlar artan düzende sırasıyla BusinessEntityID döndürülür.
SELECT BusinessEntityID,
SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag
WHEN 1 THEN BusinessEntityID
END DESC,
CASE
WHEN SalariedFlag = 0 THEN BusinessEntityID
END;
GO
İkinci örnekte sonuç kümesi, sütun 'ABD' değerine eşit olduğunda sütun TerritoryNameCountryRegionName tarafından ve diğer tüm satırlar için sıralanır CountryRegionName .
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. UPDATE deyiminde CASE kullanma
Aşağıdaki örnek, 0 olarak ayarlanmış çalışanlar CASE için sütun UPDATE için ayarlanan değeri belirlemek üzere deyimindeki VacationHours ifadeyi kullanırSalariedFlag. Sonuçlardan negatif bir değerle VacationHoursVacationHours 10 saat çıkarıldığında 40 saat artırılır; aksi takdirde VacationHours 20 saat artar. yan OUTPUT tümcesi tatil öncesi ve sonrası değerlerini görüntülemek için kullanılır.
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. SET deyiminde CASE kullanma
Aşağıdaki örnek, tablo değerli işlevindeki CASEbir SET deyimindeki ifadeyi kullanırdbo.GetContactInfo.
AdventureWorks2025 Veritabanında, kişilerle ilgili tüm veriler tabloda depolanırPerson.Person. Örneğin, kişi bir çalışan, satıcı temsilcisi veya müşteri olabilir. İşlev, belirli FirstName bir kişinin adını (LastName) ve aile adını (BusinessEntityID) ve bu kişinin kişi türünü döndürür.
CASE deyimindeki SET ifade, sütun ContactType için görüntülenecek değeri , BusinessEntityIDveya Employee tablolarındaki Vendorsütunun Customer varlığına göre belirler.
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. HAVING yan tümcesinde CASE kullanma
Aşağıdaki örnek, deyimi tarafından döndürülen satırları kısıtlamak için yan CASE tümcesindeki ifadeyi HAVING kullanırSELECT. deyimi, tablodaki her iş unvanının HumanResources.Employee saatlik oranını döndürür. yan tümcesi HAVING , başlıkları maaşlı çalışanlar tarafından en fazla 40 dolardan fazla ödeme oranı olan veya en yüksek ödeme oranı 15 dolardan fazla olan, koşulları karşılanmayan çalışanlar tarafından tutulanlarla kısıtlar.
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. Sonuçları kategorilere ayırmak için iç içe yerleştirilmiş CASE ifadesi kullanma
Aşağıdaki örnekte, ürünleri temelinde CASEkategorilere ayırmak için iç içe ListPrice ifade kullanılır. Bir ürün listesi fiyatı 1.000 doları aşarsa, olarak kabul edilir High-end. Kalan ürünler ve CASEtemel alınarak ProductLine iç içe ListPrice yerleştirilmiş bir ifadede kategorilere ayrılmıştır.
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;
Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
H. CASE ifadesiyle SELECT deyimi kullanma
deyimi SELECT içinde CASE ifade, karşılaştırma değerlerine göre sonuç kümesinde değerlerin değiştirilmesini sağlar. Aşağıdaki örnek, ürün satırı kategorilerinin görünümünü değiştirerek daha anlaşılır hale getirmek için ifadesini kullanır CASE . Bir değer olmadığında, metin Not for sale görüntülenir.
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. UPDATE deyiminde CASE kullanma
Aşağıdaki örnek, 0 olarak ayarlanmış çalışanlar CASE için sütun UPDATE için ayarlanan değeri belirlemek üzere deyimindeki VacationHours ifadeyi kullanırSalariedFlag. Sonuçlardan negatif bir değerle VacationHoursVacationHours 10 saat çıkarıldığında 40 saat artırılır; aksi takdirde VacationHours 20 saat artar.
UPDATE dbo.DimEmployee
SET VacationHours = (
CASE
WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40
ELSE (VacationHours + 20.00)
END
)
WHERE SalariedFlag = 0;
GO