Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में CASE एक्सप्रेशन का उपयोग करना

परिचय

SQL सर्वर में CASE एक्सप्रेशन का उपयोग कॉलम मान प्रतिस्थापन के लिए एक विशेष फैशन या सरल प्रश्नों में परिणाम सेट प्रस्तुत करने के लिए किया जाता है। ऐसे आदेशों के लिए उपयोग के मामले विभिन्न हैं।

उदाहरण के लिए, विभाग कोड वाला एक कॉलम है, लेकिन आप कोड के बजाय विभाग का नाम प्रदर्शित करना चाहते हैं। आप विभाग के विवरण वाली किसी अन्य तालिका के साथ जॉइन करके इसे प्राप्त कर सकते हैं। हालाँकि, मान लें कि आप क्वेरी को अपेक्षाकृत सरल रखना चाहते हैं। एक अन्य उपयोग का मामला गणना किए गए मान सेट के लिए विशिष्ट मान लौटाएगा। यदि निर्दिष्ट करने के लिए शर्तों के सेट समान नहीं हैं, तो परिकलित कॉलम फिट नहीं होंगे।

सामान्यतया, SQL सर्वर केस एक्सप्रेशन का फॉर्म लिस्टिंग 1 में दिखाया गया है।

-- Listing 1: CASE Expression Syntax
-- Simple CASE Expression
SELECT 
  col1
, col2
, CASE col3
WHEN 'a' THEN 'xxx'
WHEN 'b' THEN 'yyy'
WHEN 'c' THEN 'zzz'
ELSE 'Invalid Value'
END AS col3_name
FROM table_name;

-- Searched CASE Expression
SELECT 
  col1
, col2
, CASE
WHEN col3 = 1 THEN 'xxx'
WHEN col3 BETWEEN 2 and 9 THEN 'yyy'
WHEN col3 > 10 THEN 'zzz'
ELSE 'Invalid Value'
END AS col3_name
FROM table_name;

साधारण मामला और खोजा गया मामला

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

ध्यान दें कि CASE व्यंजक के परिणाम एकल स्तंभ में फ़िट होते हैं। साथ ही, ध्यान दें कि हम साधारण केस एक्सप्रेशन में केस क्लॉज के ठीक बाद कॉलम नाम निर्दिष्ट करते हैं। हालांकि, खोजे गए केस एक्सप्रेशन में, हमें प्रत्येक बूलियन एक्सप्रेशन के लिए कॉलम नाम निर्दिष्ट करना होगा। आइए कुछ उदाहरण देखें।

परिदृश्य पर्यावरण

CASE अभिव्यक्ति की खोज में, हम जाने-माने वाइडवर्ल्ड इम्पोर्टर्स नमूना डेटाबेस का उपयोग करेंगे। वहां, हम Sales.CustomerTransactions . का उपयोग करेंगे CASE अभिव्यक्ति अनुप्रयोग के विभिन्न परिदृश्यों को प्रदर्शित करने के लिए तालिका। जैसा कि टी-एसक्यूएल के साथ आम है, जॉइन जैसी अन्य तकनीकों का उपयोग करके समान परिणाम प्राप्त करना संभव है, लेकिन हम केस अभिव्यक्ति क्षमताओं को दिखाने के लिए एक तालिका पर ध्यान केंद्रित करते हैं।

ध्यान दें कि CASE अभिव्यक्तियों का उपयोग करने के लिए संभाले गए डेटा को समझना चाहिए। उदाहरण के लिए, हमें पता होना चाहिए कि प्रत्येक ग्राहक . क्या है कोड का अर्थ अंतिम उपयोगकर्ता के लिए अधिक समझदारी के साथ डेटा का प्रतिनिधित्व करना है। हमारे मामलों में, हम अन्य तालिकाओं से जानकारी प्राप्त कर सकते हैं।

लिस्टिंग 2 एक साधारण क्वेरी है जो दिखाती है कि तालिका में डेटा कैसा दिखता है। चित्र 1 हमें एक आउटपुट भाग दिखाता है।

-- Listing 2: Data Set in Sales.CustomerTransactions
SELECT TOP (1000) [CustomerTransactionID]
      , [CustomerID]
      , [TransactionTypeID]
      , [InvoiceID]
      , [PaymentMethodID]
      , [TransactionDate]
      , [AmountExcludingTax]
      , [TaxAmount]
      , [TransactionAmount]
      , [OutstandingBalance]
      , [FinalizationDate]
      , [IsFinalized]
      , [LastEditedBy]
      , [LastEditedWhen]
  FROM [WideWorldImporters].[Sales].[CustomerTransactions] ;

ग्राहक आईडी के आधार पर ग्राहक नाम लौटाना

इस उदाहरण में, हम ग्राहक कोड के आधार पर प्रत्येक ग्राहक का नाम प्रदर्शित करना चाहते हैं। जॉइन क्वेरी का उपयोग करके हम दूसरी तालिका से ग्राहकों के नाम प्राप्त करते हैं। फिर से, हम केस एक्सप्रेशन का उपयोग यह प्रदर्शित करने के लिए कर रहे हैं कि यह दृष्टिकोण क्या कर सकता है।

-- Listing 3a: Determine Names Using a Join
select distinct top 10 b.CustomerID, a.CustomerName
from Sales.Customers a,Sales.CustomerTransactions b
where a.CustomerID = b.CustomerID;
-- Listing 3b: Determine Names Using a Join (Alternative)
select distinct top 10 b.CustomerID, a.CustomerName
from Sales.Customers a
inner join Sales.CustomerTransactions b
on a.CustomerID = b.CustomerID;

इस जानकारी के होने पर, हम केवल Sales.CustomerTransactions से डेटा पुनर्प्राप्त करने के लिए एक साधारण CASE क्वेरी लिखते हैं (सूची 4 देखें)। चित्र 3 क्वेरी द्वारा लौटाए गए नामों पर प्रकाश डालता है।

‘अज्ञात ग्राहक’ . की घटना पर गौर करें आउटपुट में। सही मायने में ये ग्राहक अनजान नहीं हैं। हमारे पास वे नहीं हैं क्योंकि हमने अपनी CASE अभिव्यक्ति में उनके CustomerID को पूरा नहीं किया है। यह केस एक्सप्रेशन का उपयोग करते समय डेटा को समझने की आवश्यकता को पुष्ट करता है।

-- Listing 4: Simple CASE Expression for Customer Name
SELECT TOP (20) 
CASE CustomerID 
	WHEN 1 THEN 'Tailspin Toys'
	WHEN 401 THEN 'Wingtip Toys'
	WHEN 801 THEN 'Eric Torres'
	WHEN 802 THEN 'Cosmina Vlad'
	WHEN 803 THEN 'Bala Dixit'
	WHEN 804 THEN 'Alekxandrs Reikstins'
	WHEN 805 THEN 'Ratan Podder'
	WHEN 806 THEN 'Shi Tu'
	WHEN 807 THEN 'Gunnar Lohmus'
	WHEN 808 THEN 'Jackson Kolios'
ELSE 'Unknown Customer'
END CustomerName
      , [InvoiceID]
      , [TransactionDate]
      , [TransactionAmount]
      , [OutstandingBalance]
      , [IsFinalized]
	  , [FinalizationDate]
      , [LastEditedBy]
      , [LastEditedWhen]
  FROM [WideWorldImporters].[Sales].[CustomerTransactions];

लेन-देन राशि के आधार पर ग्राहक वर्ग को लौटाना

इस उदाहरण में, हम खोजे गए केस एक्सप्रेशन का उपयोग यह दिखाने के लिए करते हैं कि लेनदेन मूल्य के संबंध में हमारा कौन सा ग्राहक अधिक मूल्य का है।

हम ग्राहकों को लेनदेन मूल्य के आधार पर तीन समूहों - नियमित, चांदी, सोना और प्लेटिनम में वर्गीकृत करते हैं। बेशक, यह सरल है। वास्तविक दुनिया के परिदृश्य में, हमें एक निश्चित अवधि में उनके लेनदेन का योग करना होगा। इस मामले में, हम CASE अभिव्यक्ति क्षमताओं को दिखाने के लिए केवल एक डेटा सबसेट का उपयोग कर रहे हैं।

-- Listing 5: Searched Case Expression for Customer Class 
SELECT TOP (20) 
CASE CustomerID 
	WHEN 1 THEN 'Tailspin Toys'
	WHEN 401 THEN 'Wingtip Toys'
	WHEN 801 THEN 'Eric Torres'
	WHEN 802 THEN 'Cosmina Vlad'
	WHEN 803 THEN 'Bala Dixit'
	WHEN 804 THEN 'Alekxandrs Reikstins'
	WHEN 805 THEN 'Ratan Podder'
	WHEN 806 THEN 'Shi Tu'
	WHEN 807 THEN 'Gunnar Lohmus'
	WHEN 808 THEN 'Jackson Kolios'
ELSE 'Unknown Customer'
END CustomerName
      	, [InvoiceID]
	, [TransactionDate] 
, CASE  
	WHEN [TransactionAmount] BETWEEN 100 AND 1000 THEN 'Silver Customer'
	WHEN [TransactionAmount] BETWEEN 1000 AND 3000 THEN 'Gold Customer'
	WHEN [TransactionAmount] >= 3000 THEN 'Platinum Customer'
	ELSE 'Regular Customer'
	END AS CustomerClass
, [OutstandingBalance]
      	, [IsFinalized]
	  , [FinalizationDate]
      	, [LastEditedBy]
      	, [LastEditedWhen]
  FROM [WideWorldImporters].[Sales].[CustomerTransactions];

नेस्टेड केस एक्सप्रेशन का उपयोग करके सप्ताह का दिन लौटाना

हम एक नमूना जोड़कर नमूनों के साथ आगे बढ़ते हैं जो हमें बताते हैं कि सप्ताह का कौन सा दिन लेन-देन की तारीख थी (सूची 6 देखें)। ध्यान दें कि हम DATEPART फ़ंक्शन के बजाय DATENAME फ़ंक्शन का उपयोग करके क्वेरी के अधिक सरल रूप का उपयोग करके इसे प्राप्त कर सकते थे।

-- Listing 6: Case Expression for Day of Week Using A Function  
SELECT TOP (20) 
CASE CustomerID 
	WHEN 1 THEN 'Tailspin Toys'
	WHEN 401 THEN 'Wingtip Toys'
	WHEN 801 THEN 'Eric Torres'
	WHEN 802 THEN 'Cosmina Vlad'
	WHEN 803 THEN 'Bala Dixit'
	WHEN 804 THEN 'Alekxandrs Reikstins'
	WHEN 805 THEN 'Ratan Podder'
	WHEN 806 THEN 'Shi Tu'
	WHEN 807 THEN 'Gunnar Lohmus'
	WHEN 808 THEN 'Jackson Kolios'
ELSE 'Unknown Customer'
END CustomerName
      , [InvoiceID]
, CASE  
	WHEN DATEPART(WEEKDAY,[TransactionDate]) = 1 THEN 'Sunday'
	WHEN DATEPART(WEEKDAY,[TransactionDate]) = 2 THEN 'Monday'
	WHEN DATEPART(WEEKDAY,[TransactionDate]) = 3 THEN 'Tuesday'
	WHEN DATEPART(WEEKDAY,[TransactionDate]) = 4 THEN 'Wednesday'
	WHEN DATEPART(WEEKDAY,[TransactionDate]) = 5 THEN 'Thursday'
	WHEN DATEPART(WEEKDAY,[TransactionDate]) = 6 THEN 'Friday'
	WHEN DATEPART(WEEKDAY,[TransactionDate]) = 7 THEN 'Saturday'
	END AS [Day of Week]
, CASE  
	WHEN [TransactionAmount] BETWEEN 100 AND 1000 THEN 'Silver Customer'
	WHEN [TransactionAmount] BETWEEN 1000 AND 3000 THEN 'Gold Customer'
	WHEN [TransactionAmount] >= 3000 THEN 'Platinum Customer'
	ELSE 'Regular Customer'
	END AS CustomerClass
	  , [OutstandingBalance]
      , [IsFinalized]
	  , [FinalizationDate]
      , [LastEditedBy]
      , [LastEditedWhen]
  FROM [WideWorldImporters].[Sales].[CustomerTransactions];

तारीख के आधार पर लेन-देन का लेबल लगाना

लिस्टिंग 7 और 8 में कोड का उपयोग करके, हम वर्तमान तिथि और लेन-देन की तारीख के बीच के अंतर के आधार पर लेनदेन को लेबल कर सकते हैं। यह लेन-देन की तारीख और दूसरे कॉलम के बीच के अंतर पर भी लागू होता है। इसलिए, हम बूलियन एक्सप्रेशन के इनपुट के रूप में उन कॉलमों के अलावा अन्य कॉलम पेश कर सकते हैं जिनके साथ हम काम कर रहे हैं।

  -- Listing 7: Case Expression for Transaction by Comparing Two “Columns”
SELECT TOP (20) 
CASE CustomerID 
	WHEN 1 THEN 'Tailspin Toys'
	WHEN 401 THEN 'Wingtip Toys'
	WHEN 801 THEN 'Eric Torres'
	WHEN 802 THEN 'Cosmina Vlad'
	WHEN 803 THEN 'Bala Dixit'
	WHEN 804 THEN 'Alekxandrs Reikstins'
	WHEN 805 THEN 'Ratan Podder'
	WHEN 806 THEN 'Shi Tu'
	WHEN 807 THEN 'Gunnar Lohmus'
	WHEN 808 THEN 'Jackson Kolios'
ELSE 'Unknown Customer'
END CustomerName
      , [InvoiceID]
, CASE  
	WHEN DATEDIFF(DAY,[TransactionDate],GETDATE()) < 30 THEN 'Current Transaction'
	WHEN DATEDIFF(DAY,[TransactionDate],GETDATE()) BETWEEN 30 AND 90 THEN 'Old Transaction'
	WHEN DATEDIFF(DAY,[TransactionDate],GETDATE()) BETWEEN 90 AND 365 THEN 'Stale Transaction'
	WHEN DATEDIFF(DAY,[TransactionDate],GETDATE()) >= 365 THEN 'Archived Transaction'
	END AS [Transaction Age]
, CASE  
	WHEN [TransactionAmount] BETWEEN 100 AND 1000 THEN 'Silver Customer'
	WHEN [TransactionAmount] BETWEEN 1000 AND 3000 THEN 'Gold Customer'
	WHEN [TransactionAmount] >= 3000 THEN 'Platinum Customer'
	ELSE 'Regular Customer'
	END AS CustomerClass
	  , [OutstandingBalance]
      , [IsFinalized]
	  , [FinalizationDate]
      , [LastEditedBy]
      , [LastEditedWhen]
  FROM [WideWorldImporters].[Sales].[CustomerTransactions];
-- Listing 8: Case Expression for Transaction by Comparing Two Columns  
SELECT TOP (20) 
CASE CustomerID 
	WHEN 1 THEN 'Tailspin Toys'
	WHEN 401 THEN 'Wingtip Toys'
	WHEN 801 THEN 'Eric Torres'
	WHEN 802 THEN 'Cosmina Vlad'
	WHEN 803 THEN 'Bala Dixit'
	WHEN 804 THEN 'Alekxandrs Reikstins'
	WHEN 805 THEN 'Ratan Podder'
	WHEN 806 THEN 'Shi Tu'
	WHEN 807 THEN 'Gunnar Lohmus'
	WHEN 808 THEN 'Jackson Kolios'
ELSE 'Unknown Customer'
END CustomerName
      , [InvoiceID]
, CASE  
	WHEN DATEDIFF(DAY,[TransactionDate],[FinalizationDate]) < 30 THEN 'Prompt Transaction'
	WHEN DATEDIFF(DAY,[TransactionDate],[FinalizationDate]) BETWEEN 30 AND 90 THEN 'Delayed Transaction'
	WHEN DATEDIFF(DAY,[TransactionDate],[FinalizationDate]) BETWEEN 90 AND 365 THEN 'Serverely Delayed Transaction'
	WHEN DATEDIFF(DAY,[TransactionDate],[FinalizationDate]) >= 365 THEN 'Orphaned Transaction'
	END AS [Transaction Response]
, CASE  
	WHEN [TransactionAmount] BETWEEN 100 AND 1000 THEN 'Silver Customer'
	WHEN [TransactionAmount] BETWEEN 1000 AND 3000 THEN 'Gold Customer'
	WHEN [TransactionAmount] >= 3000 THEN 'Platinum Customer'
	ELSE 'Regular Customer'
	END AS CustomerClass
, [OutstandingBalance]
      	, [IsFinalized]
, [FinalizationDate]
      	, [LastEditedBy]
      	, [LastEditedWhen]
  FROM [WideWorldImporters].[Sales].[CustomerTransactions];

चयन सूची के बाहर केस अभिव्यक्तियां

हम SET स्टेटमेंट, UPDATE स्टेटमेंट, WHERE क्लॉज़, HAVING क्लॉज़ और ORDER BY क्लॉज़ में CASE एक्सप्रेशन का भी उपयोग कर सकते हैं।

लिस्टिंग 9 में अपडेट स्टेटमेंट बकाया बैलेंस . को अपडेट करता है अलग-अलग मान वाले चार अलग-अलग ग्राहक आईडी वाली पंक्तियों का स्तंभ। यह कथन प्रत्येक मामले और फिर ELSE के लिए पांच अलग-अलग अद्यतन विवरण लिखने के बराबर है।

-- Listing 9: Update Statement with CASE Expression 
  UPDATE Sales.CustomerTransactions
  SET OutstandingBalance =
	(CASE 
		WHEN CustomerID = 832 THEN 100.00
		WHEN CustomerID = 803 THEN 150.00
		WHEN CustomerID = 905 THEN 200.00
		WHEN CustomerID = 976 THEN 70.00
		ELSE 50.00
	END
	);
	SELECT TOP 20 * FROM Sales.CustomerTransactions;

निष्कर्ष

एसक्यूएल और टी-एसक्यूएल आपको कॉलम में संग्रहीत मूल्यों को अपने वांछित मूल्यों के साथ प्रतिस्थापित करने की अनुमति देते हैं। इस लेख में, हमने उदाहरणों के साथ सरल और खोजे गए मामले के भावों की खोज की है।

CASE एक्सप्रेशन का उपयोग SELECT क्लॉज़, SET स्टेटमेंट, UPDATE स्टेटमेंट, WHERE, HAVING, और ORDER BY क्लॉज़ पर किया जा सकता है।

संदर्भ

मामला
दिनांक और समय के कार्य


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या आपको SQL सर्वर में MONEY या DECIMAL(x,y) डेटाटाइप चुनना चाहिए?

  2. कॉलम नाम और संग्रहीत प्रक्रिया के प्रकार पुनर्प्राप्त करें?

  3. बाधा का नाम जाने बिना विदेशी कुंजी छोड़ें?

  4. SQL सर्वर में वैरिएबल मेमोरी ग्रांट का समस्या निवारण

  5. एमएस एसक्यूएल सर्वर क्रॉस टेबल बाधा