2013-01-07 26 views
99

मेरे पास एक SQL कथन है जिसमें SELECT से है और मैं इसे सही नहीं समझ सकता। क्या आप मुझे CASE का उदाहरण दिखा सकते हैं जहां मामले स्थितियां हैं और परिणाम मामले से हैं। उदाहरण के लिए:चयन वक्तव्य में केस

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

जहां परिणाम

name       age  handphone 
xxx1       yyy1  blackberry 
xxx2       yyy2  blackberry 
+0

[मेरा उत्तर] (http://stackoverflow.com/a/38874485/1045444) दो केस प्रकारों को समझाता है 1. सरल केस अभिव्यक्ति 2. खोजे गए केस अभिव्यक्तियां। और दोनों प्रकार के केस उपयोग, चयन, अद्यतन के साथ, ऑर्डर के साथ, अद्यतन के साथ। –

उत्तर

148

दिखाने MSDN वाक्य रचना और उपयोग के बारे में सवाल के इन प्रकार के लिए एक अच्छा संदर्भ है। यह ट्रांजैक्ट एसक्यूएल संदर्भ - केस पेज से है।

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 Central है। SQL सर्वर के जो भी क्षेत्र आप सीखना चाहते हैं, उसके लिए संसाधनों की एक बड़ी विविधता उपलब्ध है।

6

आप भी उपयोग कर सकते हैं:

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 
51

मुझे लगता है कि इन आपके लिए उपयोगी हो सकता है।

एक सरल CASE अभिव्यक्ति

एक SELECT बयान के भीतर, एक सरल CASE अभिव्यक्ति केवल एक समानता जांच करने के लिए अनुमति देता है के साथ एक SELECT बयान का उपयोग करना; कोई अन्य तुलना नहीं की जाती है। निम्नलिखित उदाहरण CASE अभिव्यक्ति का उपयोग उत्पाद लाइन श्रेणियों के प्रदर्शन को बदलने के लिए उन्हें अधिक समझने योग्य बनाने के लिए करता है।

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 

, एक की खोज CASE अभिव्यक्ति

एक SELECT बयान के भीतर के साथ एक SELECT बयान का उपयोग करते हुए खोज CASE अभिव्यक्ति मूल्यों परिणाम तुलना मूल्यों पर आधारित सेट में बदला जाएगा के लिए अनुमति देता है। निम्न उदाहरण किसी उत्पाद के मूल्य सीमा के आधार पर सूची मूल्य को टेक्स्ट टिप्पणी के रूप में प्रदर्शित करता है।

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 

एक ORDER BY खंड

निम्न उदाहरण में CASE का उपयोग करते हुए किसी दिए गए स्तंभ मूल्य के आधार पर पंक्तियों की तरह निर्धारित करने के लिए एक ORDER BY खंड में CASE अभिव्यक्ति का उपयोग करता है। पहले उदाहरण में, HumanResources के SalariedFlag कॉलम में मान। कर्मचारी तालिका का मूल्यांकन किया जाता है। कर्मचारी जिनके पास SalariedFlag 1 सेट है, वे BusinessEntityID द्वारा अवरोही क्रम में क्रमशः लौटा दिए जाते हैं। कर्मचारी जिनके पास SalariedFlag 0 पर सेट है, वे BusinessEntityID द्वारा आरोही क्रम में क्रमशः लौटा दिए जाते हैं। दूसरे उदाहरण में, परिणाम सेट कॉलम टेरिटरीनाम द्वारा आदेश दिया जाता है जब कॉलम CountryRegionName 'अन्य राज्यों' के बराबर है और CountryRegionName द्वारा अन्य सभी पंक्तियों के लिए है।

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; 

एक UPDATE बयान

निम्न उदाहरण मूल्य है कि कर्मचारियों के लिए स्तंभ VacationHours के लिए सेट कर दिया जाता SalariedFlag 0. जब करने के लिए सेट के साथ निर्धारित करने के लिए एक UPDATE बयान में CASE अभिव्यक्ति का उपयोग करता है में CASE का उपयोग करना VacationHours से 10 घंटे घटाने के परिणामस्वरूप ऋणात्मक मूल्य होता है, VacationHours 40 घंटे तक बढ़ जाती है; अन्यथा, VacationHours 20 घंटे तक बढ़ा है। OUTPUT खंड का उपयोग छुट्टी मूल्यों के पहले और बाद में प्रदर्शित करने के लिए किया जाता है।

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; 

एक HAVING खंड

निम्न उदाहरण एक HAVING खंड में CASE अभिव्यक्ति का उपयोग करता पंक्तियों SELECT बयान से लौटे प्रतिबंधित करने के लिए में CASE का उपयोग करना। बयान मानव संसाधनों में प्रत्येक नौकरी शीर्षक के लिए अधिकतम प्रति घंटा दर देता है। कर्मचारी तालिका। HAVING खंड उन लोगों के लिए खिताब प्रतिबंधित करता है जो पुरुषों द्वारा रखी गई अधिकतम वेतन दर 40 डॉलर से अधिक या अधिकतम 42 डॉलर से अधिक की अधिकतम वेतन दर वाली महिलाओं को प्रतिबंधित करती हैं।

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; 

अधिक जानकारी के लिए इन उदाहरणों का विवरण source पर जाएं।

कुछ विवरणों के लिए here और here पर भी जाएं।