CASE (Transact-sql)

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

Servis TALEBI ifade iki biçimi vardır:

  • Servis TALEBI basit ifade sonucu belirlemek için basit ifadeler kümesi için bir ifade karşılaştırır.

  • Aranan bir servis TALEBI ifade sonucu belirlemek için Boole ifadeleri değerlendirir.

İki biçimi isteğe bağlı bir else bağımsız değişkenini destekler.

DURUMDA, herhangi bir açıklama veya geçerli bir ifade veren yan tümcesi kullanılabilir. Örneğin, eğer durumda deyimleri select, update, delete ve set gibi ve yan select_list gibi nerede, order by ve HAVING kullanabilirsiniz.

Konu bağlantısı simgesi Transact-SQL Sözdizim 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 durumda biçimi kullanıldığında ifadesi değerlendirilir. input_expressionherhangi bir geçerli ifade.

  • NE ZAMANwhen_expression
    Hangi basit bir ifade input_expressionbasit durumda biçimi kullanıldığında karşılaştırılır. Herhangi bir geçerli when_expression. Veri türlerini input_expressionve her when_expressionaynı olmalı veya bir örtük dönüştürme olmalı.

  • SONRAresult_expression
    İfade zaman döndürülen input_expressioneşittir when_expressiontrue olarak değerlendirilir veya Boolean_expressiontrue değerlendirir. result expressionherhangi bir geçerli ifade.

  • BAŞKAelse_result_expression
    İfadeyi hiçbir karşılaştırma işlemi true olarak değerlendirilir döndürdü. Bu bağımsız değişken atlanırsa ve hiçbir karşılaştırma işlemi doğru olarak değerlendirilirse, örnek null döndürüyor. Herhangi bir geçerli ifade else_result_expression. Veri türlerini else_result_expressionve herhangi bir result_expressionaynı olmalı veya bir örtük dönüştürme olmalı.

  • WHEN Boolean_expression
    Ne zaman değerlendirilen Boolean deyim arama büyük/küçük harf biçimi kullanıyor. Boolean_expressiongeçerli bir Boole işifade.

Dönüş Türleri

En yüksek öncelik tipi türleri dizi döndürür result_expressionsve isteğe bağlı else_result_expression. Daha fazla bilgi için, bkz. Veri türü önceliği (Transact-sql).

Dönüş değerleri

Servis TALEBI basit ifade:

Servis TALEBI basit ifade her olduğunda yan tümcesi için eşdeğeri ifade ilk ifade karşılaştırarak çalışır. Bu ifadeler eşdeğerdir, O yan tümcesi ifadesinde döndürülür.

  • Yalnızca bir eşitlik onay verir.

  • Değerlendiren input_expressionve sonra belirtilen sırada input_expression= when_expressionher olduğunda yan tümcesi için.

  • Döner result_expressionilk input_expression= when_expressiontrue değerlendirir.

  • Hiç input_expression= when_expressiontrue olarak değerlendirilir SQL Server Veritabanı Altyapısıdöner else_result_expressionelse yan tümcesi belirtilirse, ya da hiçbir else yan tümcesi belirtilirse null değer.

Servis TALEBI ifade aranır:

  • Değerlendirir, belirtilen sırayla Boolean_expressionher olduğunda yan tümcesi için.

  • Döner result_expressionilk Boolean_expressiontrue değerlendirir.

  • Hiç Boolean_expressiontrue olarak değerlendirilir Veritabanı Altyapısıdöner else_result_expressionelse yan tümcesi belirtilirse, ya da hiçbir else yan tümcesi belirtilirse null değer.

Açıklamalar

SQL Serveriç içe harf ifadeleri yalnızca 10 düzeyleri sağlar.

Servis TALEBI ifade Transact-sql deyimleri, deyimi bloğu, kullanıcı tanımlı işlevler ve saklı yordamlar yürütülmesini akışını denetlemek için kullanılamaz. Denetim akış yöntemleri listesi için bkz: Akış denetimi dil (Transact-sql).

Bir servis talebi deyimi sırayla kendi koşullarını değerlendirir ve kimin koşulu memnun ilk koşulu ile durur. Bazı durumlarda, bir servis talebi deyimi kendi giriş olarak ifade sonuçlarını alır önce ifade değerlendirilir. Bu ifadeler değerlendirilmesinde olası hatalardır. Toplama ifadeleri case deyimi bağımsız değişkenlerini öncelikle değerlendirilir, sonra bir servis talebi deyimi sağlanan tıklattığında görünür. Örneğin, aşağıdaki sorgu bir bölme sıfır hata ile maksimum toplam değeri üretirken üretir. Bu durumda deyim değerlendirilmeden önce oluşur.

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 ;

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 ;

Ne zaman bir değerlendirilmesi amacıyla, yalnızca bağımlı olmamalıdır koşulları (scalars dönmek ilişkili olmayan alt dahil) skalar ifadeleri, toplama ifadeleri için değil.

Örnekler

A.Bir select deyimi ile basit bir servis TALEBI ifade kullanma

İçinde bir SELECTdeyimi, basit bir CASEifadesi yalnızca bir eşitlik denetleme; izin verir. diğer bir karşılaştırma yapılır. Aşağıdaki örnek CASEdaha anlaşılır yapmak için ürün hattı kategori görünümünü değiştirmek için ifade.

USE AdventureWorks2012;
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 deyimi ile aranan bir servis TALEBI ifade kullanma

İçinde bir SELECTdeyimi, aranan CASEifade verir değerleri karşılaştırma değerlerine dayalı sonuç kümesinde değiştirilecek. Aşağıdaki örnek, bir ürün için fiyat aralığını temel alan bir metin yorum liste fiyatını görüntüler.

USE AdventureWorks2012;
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.Microsoft Access'te kullanılan IIf işlevini yerine case kullanma

case IIf işlevine benzer bir işlevsellik sağlar Microsofterişim. Kullanan basit bir sorgu aşağıdaki örnekte gösterilmiştir IIfiçin bir çıkış değeri sağlamak için TelephoneInstructionsolan adlı bir Access tablosunda sütun db1.ContactInfo.

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

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

Aşağıdaki örnek CASEiçin bir çıkış değeri sağlamak için TelephoneSpecialInstructionssütununda AdventureWorks2012 Görünümü Person.vAdditionalContactInfo.

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

D.order by yan tümcesinde case kullanma

Aşağıdaki örnekler, bir belirli sütun değerine göre bir satır sıralama düzenini belirlemek için bir order by yan tümcesinde case deyimi kullanır. İlk örnekte, değeri SalariedFlagsütununda HumanResources.Employeetablo değerlendirilen. Çalışanları SalariedFlag1 olarak ayarlanmış tarafından sırayla döndürülür EmployeeIDAzalan. Çalışanları SalariedFlag0 olarak ayarlanırsa, tarafından sırayla döndürülür EmployeeIDartan sırada. İkinci örnek, sonuç kümesi sütun tarafından sipariş edilen TerritoryNamezaman sütun CountryRegionName' ABD için ' eşit ve CountryRegionNamediğer tüm satırlar için.

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.DURUMDA bir update deyimi kullanarak

Servis TALEBI ifade bir update deyimi içinde sütun için ayarlanan değer belirlemek için aşağıdaki örnek kullanır VacationHoursçalışanları ile SalariedFlag0 olarak ayarlayın. 10 Saat çıkarılarak zaman VacationHoursnegatif bir değer sonuçlarında VacationHours40 Saat; arttı Aksi takdirde, VacationHourstarafından 20 saat arttı. output yan tümcesi görüntülemek için kullanılan önce ve sonra tatil değerleri.

USE AdventureWorks2012;
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.set deyimi içinde case kullanma

Aşağıdaki örnek servis TALEBI ifade tablo değerli işlev bir set deyimi kullanır dbo.GetContactInfo. De AdventureWorks2012 veritabanı, insanlar için ilgili tüm veriler depolanır Person.Persontablosu. Örneğin, bir çalışanın, tedarikçi temsilcisi ya da müşteri kişi olabilir. İlk ve son adı işlevi bir verilen BusinessEntityIDve bu kişi için ilgili kişi türü.Servis TALEBI ifade set deyimi görüntülemek için sütun için değeri belirler ContactTypevarlığı üzerinde temel BusinessEntityIDsütununda Employee, Vendor, ya Customertabloları.

    USE AdventureWorks2012;
    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.DURUMDA bir HAVING yan tümcesi kullanarak

Aşağıdaki örnek case deyimi bir HAVING yan tümcesi select deyimi tarafından döndürülen satır kısıtlamak için kullanır. Deyimi döndürür her unvan için maksimum Saat ücreti HumanResources.Employeetablosu. HAVING yan tümcesi, azami ödeme oranı erkeklerin 40 dolar ya da azami ödeme oranı ile kadın büyüktür 42 dolar fazla tutulan bu başlıkları kısıtlar.

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

Ayrıca bkz.

Başvuru

Ifadeler (Transact-sql)

select (Transact-sql)

BİRLEŞİM (Transact-sql)