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

SQL केस स्टेटमेंट:यह क्या है और इसका उपयोग करने के सर्वोत्तम तरीके क्या हैं?

एक SQL केस स्टेटमेंट परिभाषित तर्क के अनुसार विशेष मूल्यों, विधेय और शर्तों के आधार पर परिणामों का मूल्यांकन और रिटर्न देता है। उदाहरण के लिए, मान लें कि आपके पास निम्नलिखित विवरण वाली मतदाता तालिका है:

  • मतदाता पहचान पत्र
  • नाम
  • जन्मतिथि

यदि आप मतदान योग्यता के बारे में तर्क ढूंढ रहे थे, तो यह जन्म तिथि कॉलम में मूल्यों पर निर्भर होगा।

यदि किसी मतदाता की आयु 18 वर्ष से अधिक है, तो वे मतदान करने के पात्र हैं।

आइए एक और उदाहरण देखें। कई बार, हम कॉलम मानों को बिट्स 1 या 0 में संग्रहीत करते हैं। मान लें कि आप किसी उत्पाद की उपलब्धता के लिए मानों को 1 या 0 के रूप में संग्रहीत करते हैं। उदाहरण के लिए:

  • 1 =उत्पाद उपलब्ध है
  • 0 =उत्पाद स्टॉक में नहीं है

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

नीचे दी गई छवि में, हम डेटाबेस और एप्लिकेशन परिप्रेक्ष्य दोनों को देखते हैं।

SQL केस स्टेटमेंट क्या करता है?

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

उच्च-स्तर पर, SQL CASE कथन का सिंटैक्स नीचे दिखाया गया है। यहां, हमने कई शर्तें निर्दिष्ट की हैं। SQL सर्वर क्रमिक रूप से शर्तों का मूल्यांकन करता है। एक बार जब कोई शर्त सफलतापूर्वक मूल्यांकन कर लेती है, तो यह शेष स्थितियों के मूल्यांकन को रोक देती है। यदि कोई भी शर्त पूरी नहीं होती है, तो हम डिफ़ॉल्ट मान वापस करने के लिए वैकल्पिक ELSE कथन का उपयोग कर सकते हैं। उदाहरण के लिए, यदि हमारे पास उपलब्धता कॉलम में 0 और 1 का मान भिन्न है, तो आपको ELSE कोड ब्लॉक से आउटपुट मिलता है। इसके लिए WHEN और THEN ब्लॉक के कम से कम एक सेट की आवश्यकता होती है। CASE कथन END ब्लॉक के साथ समाप्त होना चाहिए।

आइए विभिन्न उदाहरणों का उपयोग करके SQL CASE कथन का अन्वेषण करें।

नोट:इस लेख में, हम Microsoft नमूना डेटाबेस, AdventureWorks का उपयोग करते हैं। आप इसका बैकअप Microsoft डॉक्स से डाउनलोड कर सकते हैं।

एक साधारण केस एक्सप्रेशन के साथ SELECT स्टेटमेंट

इस प्रकार के CASE कथन में, हम समानता जाँच व्यंजकों का उपयोग करते हैं। निम्न क्वेरी एक साधारण CASE अभिव्यक्ति लागू करती है।

  • अगर [SalariedFlag] में मान 1 है, तो यह सक्रिय कर्मचारी दिखाता है
  • अन्य सभी मानों के लिए, यह आउटपुट को निष्क्रिय कर्मचारी . के रूप में प्रदर्शित करता है
शीर्ष 5 राष्ट्रीय पहचान संख्या चुनें, वेतनभोगी ध्वज का मामला जब 1 फिर 'सक्रिय कर्मचारी' अन्यथा 'निष्क्रिय कर्मचारी' के रूप में [वेतनभोगी ध्वज] [AdventureWorks2019] से।[मानव संसाधन]।[कर्मचारी]

हम केस स्टेटमेंट के लिए कई शर्तें निर्दिष्ट कर सकते हैं।

शीर्ष 5 राष्ट्रीय पहचान संख्या, मामला वेतनभोगी ध्वज चुनें, जब 1 फिर 'सक्रिय कर्मचारी' जब 0 तब 'निष्क्रिय कर्मचारी' हो, अन्यथा 'अमान्य मान' के रूप में [वेतनभोगी ध्वज] [AdventureWorks2019] से।[HumanResources]।[कर्मचारी]

एसक्यूएल केस स्टेटमेंट का उपयोग कर डेटा मानकीकरण

आमतौर पर, हम SQL तालिकाओं में मानों को संग्रहीत करने के लिए संक्षिप्ताक्षरों का उपयोग करते हैं। मानक संक्षिप्ताक्षर लिंग, देश कोड, विवाह की स्थिति, लोकप्रिय उत्पाद नाम आदि हैं।

मान लीजिए कि हम कर्मचारी लिंगों को संग्रहीत करने के लिए संक्षिप्ताक्षर निर्दिष्ट करते हैं। अब, हमारे आवेदन को बिना किसी संक्षिप्ताक्षर के परिणाम प्रदर्शित करना चाहिए।

SQL केस स्टेटमेंट परिभाषित मानदंडों के लिए आउटपुट को मानकीकृत करने में मदद करते हैं। नीचे दी गई क्वेरी में, हम निम्नलिखित शर्तों का उपयोग करते हैं:

  • यदि लिंग का मान M है , इसे पुरुष . के रूप में प्रदर्शित करें
  • यदि लिंग का मान F है , इसे महिला . के रूप में प्रदर्शित करें
  • किसी अन्य मान के लिए, प्रदर्शित करें अमान्य मूल्य
विशिष्ट केस लिंग चुनें, जब 'M' फिर 'पुरुष' जब 'F' फिर 'महिला' हो, तब 'अमान्य मान', AdventureWorks2019 से लिंग के रूप में समाप्त हो जाए।HumanResources.कर्मचारी

खोज केस स्टेटमेंट

खोजे गए CASE कथन में, हम प्रत्यक्ष मानों के बजाय CASE व्यंजक निर्दिष्ट करते हैं। एक बार जब व्यंजक मान WHEN क्लॉज में किसी शर्त का मूल्यांकन करता है और उसे संतुष्ट करता है, तो उसका संगत मान वापस कर दिया जाता है।

नीचे दी गई SQL क्वेरी को देखें। यहां, हमने [ListPrice] के WHEN क्लॉज में एक्सप्रेशन को परिभाषित किया है। यह पहचानता है कि उत्पाद की लागत $250 है और इसे इलेक्ट्रॉनिक्स आइटम के रूप में चिह्नित किया गया है।

 चयन उत्पाद संख्या, नाम, [उत्पाद श्रेणी] =मामला जब सूची मूल्य =0 तब 'स्टॉक में नहीं' आइटम जब सूची मूल्य> 0 और सूची मूल्य <=100 तब 'उपभोक्ता सामान' जब सूची मूल्य> 100 और सूची मूल्य <=500 तब ' इलेक्ट्रॉनिक्स आइटम' जब ListPrice>500 और ListPrice <1500 फिर 'लक्ज़री आइटम' ELSE 'अतिरिक्त आइटम' उत्पादन से समाप्त हो जाते हैं। ListPrice desc द्वारा उत्पाद ऑर्डर 

पहले संदर्भित लिंग उदाहरण के लिए, हम खोजे गए केस स्टेटमेंट का उपयोग करके लिंग संक्षिप्तीकरण के लिए SQL CASE स्टेटमेंट को फिर से लिख सकते हैं।

DISTINCT केस का चयन करें जब लिंग ='M' तब 'पुरुष' जब लिंग ='F' तब 'महिला' और 'अमान्य मान', AdventureWorks2019 से लिंग के रूप में समाप्त हो जाए।HumanResources.कर्मचारी

ORDER BY क्लॉज के साथ CASE स्टेटमेंट का उपयोग करना

SQL क्वेरी डेटा को आरोही या अवरोही क्रम में सॉर्ट करने के लिए ORDER BY क्लॉज का उपयोग करती है। आप ORDER BY क्लॉज के संयोजन में CASE स्टेटमेंट का उपयोग कर सकते हैं। मान लीजिए कि उत्पाद तालिका से, हम [उत्पादनाम] और [ListPrice] प्राप्त करते हैं। हम परिणामों को निम्नलिखित तरीकों से क्रमबद्ध करना चाहते हैं:

  • यदि उत्पाद सूची मूल्य 2,000 से कम है, तो आप परिणाम को डिफ़ॉल्ट सॉर्ट क्रम में चाहते हैं, अर्थात आरोही
  • यदि उत्पाद सूची मूल्य 2,000 से अधिक है, तो ORDER BY क्लॉज सॉर्ट का परिणाम अवरोही क्रम में होता है

इस क्वेरी में, हम तर्क को लागू करने के लिए दो SQL CASE कथनों का उपयोग करते हैं।

 चयन नाम, उत्पादन से सूची मूल्य। केसवेन सूची मूल्य द्वारा उत्पाद आदेश <=2000 फिर सूची मूल्य अंत, मामला जब सूची मूल्य> 2000 फिर सूची मूल्य अंत डीईएससी

नीचे दिए गए क्वेरी आउटपुट में, आप अवरोही और आरोही दोनों क्रम में प्रदर्शित होने वाले डेटा प्रकारों को सत्यापित कर सकते हैं।

एक अन्य उदाहरण में, मान लीजिए कि हम निम्नलिखित शर्तों के आधार पर कर्मचारी तालिका में डेटा को सॉर्ट करना चाहते हैं:

  • सक्रिय कर्मचारियों के लिए (वर्तमान ध्वज =1), डेटा को किराया तिथि कॉलम को क्रमबद्ध करना चाहिए
  • निष्क्रिय कर्मचारियों के लिए, इसे जन्मतिथि कॉलम में मानों के अनुसार डेटा सॉर्ट करना चाहिए
नेशनल आईडी नंबर, जॉब टाइटल, हायरडेट, जन्मतिथि, करेंटफ्लैग एडवेंचरवर्क्स 2019 से चुनें। 

क्वेरी आउटपुट में, हम ORDER BY क्लॉज और CASE स्टेटमेंट द्वारा परिभाषित डेटा सॉर्ट ऑर्डर को सत्यापित कर सकते हैं।

एसक्यूएल और एग्रीगेट फंक्शन में केस स्टेटमेंट

SQL सर्वर में कुल कार्य गणना करते हैं और एक मान लौटाते हैं। कुल कार्यों के उदाहरण हैं MIN, MAX, COUNT, ABG और CHECKSUM।

मान लीजिए हम 2007-2010 से प्रत्येक वर्ष के लिए कर्मचारी किराया गणना प्राप्त करना चाहते हैं। इसे निम्नलिखित प्रारूप में परिणाम प्रदर्शित करने चाहिए:

इस उद्देश्य के लिए, हम SQL सर्वर में COUNT एग्रीगेट फ़ंक्शन का उपयोग करते हैं।

  • सबसे पहले, SQL DATEPART फ़ंक्शन वर्ष के अनुसार डेटा फ़िल्टर करता है। उदाहरण के लिए, DATEPART(YY, Hiredate)=2007, वर्ष 2007 के लिए डेटा फ़िल्टर करता है।
  • यदि वर्ष 2007 है तो हम 1 को वापस करने के लिए केस स्टेटमेंट का उपयोग करते हैं।
  • संकलित गणना फ़ंक्शन रिकॉर्ड की गणना करता है और परिणाम प्रदर्शित करता है।
  • इसी तरह, क्वेरी शेष वर्षों के लिए काम करती है।
 चयन गणना (केसवेन डेटपार्ट (वाई, किराए पर लेना) =2007 फिर 1 ईएलएसई न्यूलेंड) [2007 हायर] के रूप में, गणना (केसवेन डेटपार्ट (वाई, किराए पर) =2008 फिर 1 ईएलएसई न्यूलेंड) एएस [2008 हायर], गणना (केसवेन डेटपार्ट (वाई वाई) , किराए पर लेना) =2009 फिर 1ELSE NULLEND) AS [2009Hires], काउंट (CASEWHEN Datepart(yy, rentate) =2009 फिर 1ELSE NULLEND) AS [2010Hires] From AdventureWorks2019.HumanResources.Employee

इसी तरह, मान लें कि हम समान उत्पाद श्रेणी वाली पंक्तियों को समूहबद्ध करने के लिए कुल फ़ंक्शन GROUP BY का उपयोग करना चाहते हैं। हम समूहित परिणाम सेट से डेटा को सॉर्ट करने के लिए SQL में CASE कथन निर्दिष्ट कर सकते हैं।

चुनें [उत्पाद श्रेणी] =केस जब सूची मूल्य =0 तब 'स्टॉक में नहीं है' जब सूची मूल्य> 0 और सूची मूल्य <=100 तब 'उपभोक्ता सामान' जब सूची मूल्य> 100 और सूची मूल्य <=500 तब 'इलेक्ट्रॉनिक्स आइटम' जब सूची मूल्य> 500 और सूची मूल्य <1500 फिर 'लक्जरी आइटम' और 'अतिरिक्त आइटम' अंत, न्यूनतम (सूची मूल्य) न्यूनतम मूल्य के रूप में, अधिकतम (सूची मूल्य) अधिकतम मूल्य के रूप में, गणना (सूची मूल्य) उत्पादन से उत्पादों की संख्या के रूप में। केस द्वारा उत्पाद समूह सूची मूल्य =0 फिर 'स्टॉक से बाहर आइटम' जब सूची मूल्य> 0 और सूची मूल्य <=100 तब 'उपभोक्ता सामान' जब सूची मूल्य> 100 और सूची मूल्य <=500 तब 'इलेक्ट्रॉनिक्स आइटम' जब सूची मूल्य> 500 और सूची मूल्य <1500 फिर 'लक्जरी आइटम' अन्यथा 'अतिरिक्त आइटम' ऑर्डर ऑफ प्रोडक्ट्स डीईएससी द्वारा ऑर्डर करें।> 

उपरोक्त क्वेरी में, हम दो SQL केस स्टेटमेंट का उपयोग करते हैं।

  • पहला केस स्टेटमेंट सूची मूल्य में परिभाषित अभिव्यक्ति के आधार पर डेटा को वर्गीकृत करता है। इस केस स्टेटमेंट का उपयोग करते हुए, हम उत्पादों को निम्नलिखित श्रेणियों में विभाजित करते हैं:
    • स्टॉक में नहीं हैं
    • उपभोक्ता वस्तुएं
    • इलेक्ट्रॉनिक आइटम
    • लक्जरी आइटम
  • दूसरे केस स्टेटमेंट में, हम परिणाम को श्रेणी के आधार पर समूहबद्ध करने के लिए ग्रुप बाय एग्रीगेट फ़ंक्शन का उपयोग करते हैं
  • इसके अलावा, हम NumberOfProducts के अनुसार घटते क्रम में परिणामों को क्रमबद्ध करते हैं

SQL CASE कथनों का उपयोग करके शून्य त्रुटि से विभाजित होने से रोकें

शून्य से विभाजित त्रुटि तब होती है जब हर का मान शून्य होता है। यदि आप इन भिन्नों को SQL सर्वर में करते हैं, तो यह आपको शून्य त्रुटि से भाग देगा जैसा कि नीचे दिखाया गया है।

इन सामान्य गलतियों से बचने के लिए अपने प्रश्नों को एक तरह से लिखना एक उत्कृष्ट अभ्यास है। इससे बचने के लिए, हम CASE कथन के अंदर भिन्न तर्क का उपयोग करते हैं।

घोषणा @Student1 INTDECLARE @Student2 INTSET @Student1=100SET @Student2=0चयन करें जब @Student2=0तब NULLELSE @Student1/@Student2 के अंत में StudentMarksRatio

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

SQL केस स्टेटमेंट के बारे में उपयोगी रिमाइंडर

  • एसक्यूएल केस स्टेटमेंट्स नेस्टिंग के 10 स्तरों तक का समर्थन करते हैं
  • आप CASE अभिव्यक्तियों का उपयोग करके कथनों, कार्यों या प्रक्रियाओं के निष्पादन के प्रवाह को नियंत्रित नहीं कर सकते हैं
  • आपको हमेशा एक ELSE ब्लॉक का उपयोग करना चाहिए ताकि यदि कोई शर्त पूरी नहीं होती है, तो आपको एक डिफ़ॉल्ट मान मिलता है
  • आपको SQL CASE कथन में परस्पर विरोधी स्थितियों का उपयोग करने से बचना चाहिए। CASE कथन क्रमिक रूप से काम करता है और पहली सफल स्थिति के साथ मूल्यांकन करना बंद कर देता है

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. स्पॉटलाइट क्लाउड अलार्म संग्रह टाइम्स

  2. SQL सर्वर प्रबंधन स्टूडियो 2012 में ऑटो वृद्धि प्राथमिक कुंजी

  3. पदानुक्रमित डेटा की प्रतिलिपि बनाते समय अभिभावक-बाल संबंधों को सुरक्षित रखें

  4. SQL सर्वर पर varchar(MAX) बनाम TEXT का उपयोग करना

  5. SQL सर्वर में JSON दस्तावेज़ से डुप्लिकेट कुंजियाँ कैसे लौटाएँ?