Aracılığıyla paylaş


CASE (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'teki SQL analiz uç noktasıMicrosoft Fabric'teki ambarMicrosoft 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:

  • BasitCASE ifade, sonucu belirlemek için bir ifadeyi bir dizi basit ifadeyle karşılaştırır.

  • Arama yapılanCASE ifade 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 WHEN yan tümce için input_expression = when_expression değerlendirir.

  • olarak değerlendirilenilk = TRUE döndürür.

  • when_expression = input_expression belirtilmezseTRUE, SQL Server Veritabanı Altyapısı bir yan tümce belirtilirse ELSE veya yan tümce belirtilmezse NULL bir ELSE değer döndürür.

Aranan BÜYÜK/KÜÇÜK HARF ifadesi

  • Her yan tümce için belirtilen sırada WHEN değerlendirir.

  • olarak değerlendirilen ilk Boolean_expression result_expressionTRUE

  • Boolean_expression belirtilmezseTRUE, Veritabanı Altyapısı bir yan tümce belirtilirse ELSE veya yan NULL tümce belirtilmezse bir ELSE değ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