Seçme Durumunda Vaka


141

Ben bir CASEgelen bir SQL deyimi var SELECTve ben sadece doğru alamıyorum. Bana CASEvakaların durumların ve sonuçların vakalardan nerede olduğuna dair bir örnek gösterebilir misiniz ? Örneğin:

     Select xxx, yyy
     case : desc case when bbb then 'blackberry';
     when sss then 'samsung';
     end 
     from (select ???? .....

sonuçların gösterildiği

 name                         age       handphone
xxx1                         yyy1      blackberry
xxx2                         yyy2      blackberry

İki vaka türünü açıklayan cevabım 1. Basit CASE ifadesi 2. CASE ifadelerini aradı. Ve her iki türün de SELECT, UPDATE, ORDER BY, HAVING sorguları ile vaka kullanımı.
Somnath Muluk

Yanıtlar:


195

MSDN, sözdizimi ve kullanımı ile ilgili bu tür sorular için iyi bir referanstır. Bu Transact SQL Reference - CASE sayfasından.

http://msdn.microsoft.com/en-us/library/ms181765.aspx

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

SQL Server kullanıp kullanmadığınızı kontrol etmek isteyebileceğiniz başka bir iyi site de SQL Server Central'dır . Bu, öğrenmek istediğiniz SQL Server alanı için çok çeşitli kaynaklara sahiptir.


82

Bunların sizin için yararlı olabileceğini düşünüyorum.

Bir Kullanarak SELECTbasit beyanına CASEifadesi

Bir SELECTifade içinde , basit bir CASEifade sadece bir eşitlik kontrolüne izin verir; başka karşılaştırma yapılmaz. Aşağıdaki örnek CASE, ürün satırı kategorilerinin görüntülenmesini daha anlaşılır hale getirmek için ifadeyi kullanır .

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

Bir Kullanarak SELECTBir arandı beyanına CASEifadesi

Bir SELECTifade içinde , aranan CASEifade, karşılaştırma kümesine dayalı olarak sonuç kümesinde değerlerin değiştirilmesine izin verir. Aşağıdaki örnek, liste fiyatını, bir ürünün fiyat aralığına göre metin yorumu olarak 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

CASEBir ORDER BYcümlede kullanma

Aşağıdaki örnekler, belirli bir sütun değerine göre satırların sıralama düzenini belirlemek için CASEbir ORDER BYcümledeki ifadeyi kullanır . İlk örnekte, HumanResources.Employee tablosunun SalariedFlag sütunundaki değer değerlendirilir. SalariedFlag değerini 1 olarak ayarlayan çalışanlar, BusinessEntityID tarafından azalan sırada döndürülür. SalariedFlag değerini 0 olarak ayarlayan çalışanlar, BusinessEntityID tarafından sırasıyla artan sırada döndürülür. İkinci örnekte, CountryRegionName sütunu 'Amerika Birleşik Devletleri'ne eşit olduğunda sonuç kümesi TerritoryName sütunu ve diğer tüm satırlar için CountryRegionName tarafından sıralanı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


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;

Kullanma CASEbir in UPDATEdeyimi

Aşağıdaki örnek, SalariedFlag değeri 0 olarak ayarlanmış çalışanlar için VacationHours sütunu için ayarlanan değeri belirlemek üzere CASEbir ifadedeki ifadeyi kullanır. UPDATEVacationHours'tan 10 saat çıkarıldığında, negatif bir değer elde edilir; aksi takdirde VacationHours 20 saat arttırılır. OUTPUTFıkra öncesi ve tatil değerlerine sonra görüntülemek için kullanılır.

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; 

CASEBir HAVINGcümle içinde kullanma

Aşağıdaki örnek, CASEdeyim HAVINGtarafından döndürülen satırları sınırlamak için bir cümledeki ifadeyi kullanır SELECT. İfade, HumanResources.Employee tablosundaki her iş unvanı için maksimum saatlik ücreti döndürür. HAVINGFıkra 42 dolar daha fazla ödeme oranı daha sonra ile 40 dolar ya da kadınlar daha fazla ödeme oranı daha sonra ile erkekler tarafından elde tuttuğu için 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;

Bu örneğin ayrıntılı açıklaması için kaynağı ziyaret edin .

Ayrıca ziyaret burada ve burada çok detaylı bazı örnekler için.


Bu kadar ayrıntılı bir cevabı gerçekten takdir ediyorum.
Aneeq Azam Khan

12

Ayrıca kullanabilirsiniz:

SELECT CASE
         WHEN upper(t.name) like 'P%' THEN
          'productive'
         WHEN upper(t.name) like 'T%' THEN
          'test'
         WHEN upper(t.name) like 'D%' THEN
          'development'
         ELSE
          'unknown'
       END as type
FROM table t
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.