CASE (Transact-SQL)

Koşulların listesini değerlendirir ve birden çok olası sonuç ifadelerin döndürür.

Servis talebi ifade iki biçimi vardır:

  • Basit case ifade bir küme sonucu belirlemek için basit ifadelerin bir ifade karşılaştırır.

  • Aranan case ifade bir küme , sonucu belirlemek için Boole ifadeleri değerlendirir.

İsteğe bağlı else argüman her iki biçimini destekler.

Servis talebi, herhangi bir deyim veya geçerli bir ifadeveren yan tümce içinde kullanılabilir.Örneğin, büyük/küçük harf deyimleri select, update, delete ve set gibi ve select_list gibi yan tümceleri, where, order by ve HAVING kullanabilirsiniz.

Konu bağlantısı simgesiTransact-SQL sözdizimi kuralları

Sözdizimi

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

Bağımsız değişkenler

  • input_expression
    Basit büyük/küçük harf biçimi kullanıldığında, ifade değerlendirilir.input_expressionherhangi bir geçerli ifade.

  • NE ZAMANwhen_expression
    Olan basit bir ifade input_expression Basit büyük/küçük harf biçimi kullanıldığında karşılaştırılır.when_expressionGeçerli herhangi bir ifadeolur.Veri türlerini input_expression ve her when_expression aynı olması gerekir veya olması gerekir kapalı bir dönüştürme.

  • SONRAresult_expression
    Ne zaman ifade verdi input_expression eşittir when_expression , doğru değer veya Boolean_expression değerlendirir true.result expressionherhangi bir geçerli ifade.

  • ELSEelse_result_expression
    ifade hiçbir karşılaştırma işlemi true olarak değerlendirilir döndürdü.Hiçbir karşılaştırma işlemi true olarak değerlendirilir ve bu bağımsız değişken atlanırsa, örnek null döndürür.else_result_expressionGeçerli herhangi bir ifadeolur.Veri türlerini else_result_expression ve tüm result_expression aynı olması gerekir veya olması gerekir kapalı bir dönüştürme.

  • NE ZAMANBoolean_expression
    Booleifade Aranan case biçimi kullanırken değerlendirilir. Boolean_expressiontüm geçerli Booleolduğunuifade.

Dönüş Türleri

En yüksek öncelik tipi döndürür küme , türler arasında result_expressions ve isteğe bağlı else_result_expression.Daha fazla bilgi için, bkz. Veri türü önceliği (Transact-SQL).

Dönüş değerleri

Basit case ifade:

Basit büyük ifade eşdeğer her OLDUĞUNDA yan tümce ifade ilk ifade karşılaştırarak çalışır.Bu ifadeler eşdeğerdir, then yan tümce ifade döndürülür.

  • Yalnızca bir eşitlik onay verir.

  • Değerlendiren input_expression, belirtilen sıraya göre değerlendirir ve input_expression = when_expression her OLDUĞUNDA yan tümceiçin.

  • Döndürür result_expression ilk input_expression = when_expression değerlendiren true.

  • Yok, input_expression = when_expression true deðerini oluþturur, SQL Server Veritabanı Altyapısı verir else_result_expression else yan tümce belirtilirse, ya da hiç else yan tümce belirtilirse, boş bir değer.

Aranan case ifade:

  • Değerlendirir, belirtilen sırayla Boolean_expression her OLDUĞUNDA yan tümceiçin.

  • Döndürür result_expression ilk Boolean_expression değerlendiren true.

  • Yok, Boolean_expression true deðerini oluþturur, Veritabanı Altyapısı verir else_result_expression else yan tümce belirtilirse, ya da hiç else yan tümce belirtilirse, boş bir değer.

Açıklamalar

SQL Serveryalnızca 10 büyük ifadelerde iç içe düzeyleri sağlar.

Servis talebi ifade Transact -SQL deyimleri, deyim bloğu, kullanıcı tanımlı işlevler ve saklı yordamlar akışını denetlemek için kullanılamaz.Akış denetimi yöntemleri listesi için bkz: Akış denetimi dil (Transact-SQL).

Örnekler

A.Bir select deyim ile basit case ifadekullanarak

İçinde bir SELECT deyim, basit bir CASE ifade veren yalnızca bir eşitlik denetimi; diğer bir karşılaştırma yapılır.Aşağıdaki örnek daha anlaşılabilir hale getirmek için ürün satırı Kategori görünümünü değiştirmek içinCASEifade .

USE AdventureWorks2008R2;
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.Bir select deyim ile Aranan case ifadekullanarak

İçinde bir SELECT deyim, Aranan CASE ifade veren değerlerinin değiştirilmesine sonuç kümesi dayalı karşılaştırma değerleri.Aşağıdaki örnek, bir ürün için fiyat aralık dayalı yorum olarak fiyat listesi görüntüler.

USE AdventureWorks2008R2;
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.Büyük/küçük harf Değiştir Microsoft Access'te kullanılan IIf işlev kullanarak

Servis talebi, IIf işlev benzer işlevselliği sağlar Microsoft erişim.Kullanan basit bir sorgu aşağıdaki örnekte gösterilmektedir IIf için bir çıkış değeri sağlamak için TelephoneInstructions sütun Access tablo adındaki db1.ContactInfo.

SELECT FirstName, LastName, TelephoneNumber, 
     IIf(IsNull(TelephoneInstructions),"Any time",
     TelephoneInstructions) AS [When to Contact]
FROM db1.ContactInfo; 

Aşağıdaki örnek CASE için bir çıkış değeri sağlamak için TelephoneSpecialInstructions sütun AdventureWorks2008R2 view Person.vAdditionalContactInfo.

USE AdventureWorks2008R2;
GO
SELECT FirstName, LastName, TelephoneNumber, 'When to Contact' = 
     CASE
          WHEN TelephoneSpecialInstructions IS NULL THEN 'Any time'
          ELSE TelephoneSpecialInstructions
     END
FROM Person.vAdditionalContactInfo;

D.Servis talebi bir order by yan tümcetümcesinde kullanma

Aşağıdaki örnekler bir belirli sütun değerine göre bir satır sıralama düzeni belirlemek için bir order by yan tümce tümcesinde case ifade kullanır.İlk örnekte, değeri SalariedFlag sütun HumanResources.Employee tablo değerlendirildi.Sahip çalışanlar SalariedFlag1küme dönen tarafından sırayla EmployeeID Azalan sırada.Sahip çalışanlar SalariedFlag0küme dönen tarafından sırayla EmployeeID artan sırada.İkinci örnekte, sonuç kümesi sütunsıralanırTerritoryName , sütun CountryRegionName eşittir ' ABD ve bunun CountryRegionName için tüm diğer satırları.

SELECT BusinessEntityID, SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC
        ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;
GO
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;

E.Servis talebi içinde bir update deyimkullanarak

Aşağıdaki örnek büyük ifade içinde bir update deyim küme sütuniçin değeri belirlemek için kullanırVacationHours ile çalışanlar için SalariedFlag0küme . 10 Saat den çıkarılarak, VacationHours sonuçlar negatif bir değer VacationHours Artırılmış 40 saat; Aksi takdirde, VacationHours Artırılmış20 saat. tarafındanoutput yan tümce görüntülemek için kullanılan önce ve sonra tatil değerleri.

USE AdventureWorks2008R2;
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; 

F.Servis talebi bir set deyimkullanarak

Aşağıdaki örnek tabloset deyim içinde büyük ifade kullanır-değerli işlevdbo.GetContactInfo. De AdventureWorks2008R2 veritabanı, kişilerle ilgili tüm veriler depolanır Person.Person tablo.Örneğin, kişi bir çalışanı, satıcı temsilcisi ya da müşteri olabilir.İlk ve son adı işlev verir bir verilen BusinessEntityID ve o kişinin ilgili kişi türü.set deyim büyük ifade ' % s'sütun sütuniçin görüntülenecek değeri belirler ContactType varlığını dayalı BusinessEntityIDsütun  Employee, Vendor, veya Customer tablolar.

   USE AdventureWorks2008R2;
    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);

G.HAVING yan tümcetümcesinde case kullanma

Aşağıdaki örnek, select deyimtarafından döndürülen satır kısıtlamak için HAVING yan tümce tümcesinde büyük ifade kullanır.deyim döndürür iş için en yüksek saat hızı HumanResources.Employeetablo. HAVING yan tümce başlıklar en çok ödeme oranı ile Erkekler tarafından 40 dolar ya da Kadınlar en fazla ödeme oranı ile büyük 42 dolar büyük tutulan kayıtlarla sınırlar.

USE AdventureWorks2008R2;
GO
SELECT JobTitle, MAX(ph1.Rate)AS MaximumRate
FROM HumanResources.Employee AS e
JOIN HumanResources.EmployeePayHistory AS ph1 ON e.BusinessEntityID = ph1.BusinessEntityID
GROUP BY JobTitle
HAVING (MAX(CASE WHEN Gender = 'M' 
        THEN ph1.Rate 
        ELSE NULL END) > 40.00
     OR MAX(CASE WHEN Gender  = 'F' 
        THEN ph1.Rate  
        ELSE NULL END) > 42.00)
ORDER BY MaximumRate DESC;