समस्या:
आप SQL में CASE कथन का उपयोग करना चाहते हैं।
उदाहरण:
आपके पास exam
टेबल। आपको प्रत्येक परिणाम को निम्नलिखित टेक्स्ट मानों में से किसी एक को निर्दिष्ट करने की आवश्यकता है:'bad result'
, 'average result'
, या 'good result'
. खराब परिणाम वे होते हैं जो 40 से कम होते हैं, अच्छे परिणाम 70 से ऊपर वाले होते हैं, और शेष औसत परिणाम होते हैं।
exam
तालिका इस तरह दिखती है:
नाम | <थ>परिणाम|
---|---|
टोबी शॉ | 56 |
केसी वाटसन | 49 |
बेनी लिन | 23 |
लेन स्लोअन | 70 |
स्टीफ फॉक्स | 85 |
रेगी वार्ड | 40 |
गेल कैनेडी | 66 |
ब्राइस म्यूएलर | 90 |
समाधान 1:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category FROM exam;
परिणाम तालिका इस तरह दिखती है:
नाम | <थ>परिणामश्रेणी | |
---|---|---|
टोबी शॉ | 56 | औसत परिणाम |
केसी वाटसन | 49 | औसत परिणाम |
बेनी लिन | 23 | खराब परिणाम |
लेन स्लोअन | 70 | औसत परिणाम |
स्टीफ फॉक्स | 85 | अच्छा परिणाम |
रेगी वार्ड | 40 | औसत परिणाम |
गेल कैनेडी | 66 | औसत परिणाम |
ब्राइस म्यूएलर | 90 | अच्छा परिणाम |
चर्चा:
अपनी विशिष्ट शर्तों के आधार पर मान प्रदर्शित करने के लिए, आपको एक CASE
. लिखना होगा बयान। वाक्य रचना है:
CASE WHENTHEN , WHEN THEN , … ELSE END AS
अगर condition_1
पूरा हो जाता है, तो पुनः प्राप्त मान value_1
है . यदि नहीं, तो डेटाबेस condition_2
के लिए जाँच करता है . अगर condition_2
सत्य है, तो पुनः प्राप्त मान value_2
है . यदि इनमें से कोई भी शर्त पूरी नहीं होती है, तो SQL शेष शर्तों के लिए एक-एक करके जाँच करता है जब तक कि कोई एक शर्त पूरी न हो जाए। अगर कोई भी शर्त पूरी नहीं होती है, तो value_n
ELSE
. के बाद निर्दिष्ट पुनर्प्राप्त किया गया है।
ELSE
भाग वैकल्पिक है। यदि आप इसे छोड़ देते हैं और कोई भी शर्त पूरी नहीं होती है, तो आपको एक NULL
मिलता है ।
END
को याद रखें CASE
खंड जब आप सभी शर्तों के साथ कर रहे हैं। बेशक, आपके द्वारा बनाए गए किसी भी कॉलम की तरह, आप उसका नाम बदल सकते हैं (AS <column_name>
)।
हमारे उदाहरण में, 'bad result'
असाइन किया जाता है जब result < 40, and 'good result'
असाइन किया जाता है जब result > 70
. यदि इनमें से कोई भी शर्त पूरी नहीं होती है, तो मान 'average result'
. है . साथ ही, टेक्स्ट मानों के नए बनाए गए कॉलम को नाम देने के लिए, आपको एक उपनाम (AS
.) का उपयोग करना होगा श्रेणी)। आप इस प्रकार प्राप्त करते हैं:
CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category
चूंकि 'average result'
40
. के बीच परिणामों को असाइन किया गया है और 70
(समावेशी), आप ELSE
. के बजाय एक शर्त भी लिख सकते हैं (नीचे समाधान 2 देखें)। हालांकि, ELSE
का उपयोग करना आसान है ।
समाधान 2:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' WHEN result >= 40 AND result <= 70 THEN 'average result' END AS category FROM exam;
परिणाम तालिका इस तरह दिखती है:
नाम | <थ>परिणामश्रेणी | |
---|---|---|
टोबी शॉ | 56 | औसत परिणाम |
केसी वाटसन | 49 | औसत परिणाम |
बेनी लिन | 23 | खराब परिणाम |
लेन स्लोअन | 70 | औसत परिणाम |
स्टीफ फॉक्स | 85 | अच्छा परिणाम |
रेगी वार्ड | 40 | औसत परिणाम |
गेल कैनेडी | 66 | औसत परिणाम |
ब्राइस म्यूएलर | 90 | अच्छा परिणाम |
चर्चा:
चूंकि 'average result'
40
. के बीच परिणामों को असाइन किया गया है और 70
(समावेशी), आप ELSE
. के बजाय निम्न शर्त लिख सकते हैं :
WHEN result >= 40 AND result <= 70 THEN 'average result'
यदि आप ELSE
. का उपयोग नहीं करते हैं और कोई NULL
नहीं चाहिए category
में s कॉलम, आपको यह सुनिश्चित करने की ज़रूरत है कि आप हर संभव result
. का ध्यान रखें मूल्य। अगर कोई result
है जो किसी भी शर्त को पूरा नहीं करता है, आपको एक NULL
मिलता है ।
समाधान 3:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category FROM exam;
परिणाम तालिका इस तरह दिखती है:
नाम | <थ>परिणामश्रेणी | |
---|---|---|
टोबी शॉ | 56 | औसत परिणाम |
केसी वाटसन | 49 | औसत परिणाम |
बेनी लिन | 23 | खराब परिणाम |
लेन स्लोअन | 70 | औसत परिणाम |
स्टीफ फॉक्स | 85 | अच्छा परिणाम |
रेगी वार्ड | 40 | औसत परिणाम |
गेल कैनेडी | 66 | औसत परिणाम |
ब्राइस म्यूएलर | 90 | अच्छा परिणाम |
चर्चा:
CASE
. में निर्दिष्ट शर्तें पिछले समाधानों की तरह गैर-अतिव्यापी हो सकता है या इस समाधान की तरह अतिव्यापी हो सकता है। पहली शर्त पहले जैसी ही है – result < 40
. के लिए , category
'bad result'
. नीचे दिए गए सभी परिणाम 40
इस बिंदु पर यह मान असाइन किया गया है और अब आपको उनके साथ कुछ भी करने की आवश्यकता नहीं है। इसका मतलब है कि यह सुनिश्चित करने की कोई आवश्यकता नहीं है कि result >= 40
'average result'
. के लिए शर्तें निर्दिष्ट करने में - 40 से कम के सभी परिणामों का पहले से ही मान 'bad result'
. होता है सौंपा गया। अंत में, शेष परिणामों के लिए श्रेणी होनी चाहिए 'good result'
; एक साधारण ELSE 'good result'
इसकी देखभाल करता है। आप इस प्रकार प्राप्त करते हैं:
CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category
नोट:CASE
. में शर्तों का क्रम मायने रखता है। यदि आप पहली दो स्थितियों के क्रम को उलट देते हैं (अर्थात, यदि आप निर्दिष्ट करते हैं WHEN result <= 70 THEN 'average result'
पहले तो WHEN result <= 70 THEN 'average result'
दूसरा), सभी परिणाम 70
. से कम या बराबर अंत में 'average result'
श्रेणी, जिसका कोई परिणाम 'bad result'
. को निर्दिष्ट नहीं किया गया है श्रेणी।