खोज…
परिचय
CASE अभिव्यक्ति का उपयोग यदि-तब तर्क को लागू करने के लिए किया जाता है।
वाक्य - विन्यास
- CASE input_expression
जब तुलना 1 तब परिणाम 1
[जब तुलना 2 परिणाम 2] ...
[ELSE resultX]
समाप्त - मामला
जब हालत 1 तब परिणाम 1
[जब हालत 2 तब परिणाम 2] ...
[ELSE resultX]
समाप्त
टिप्पणियों
सरल मामला अभिव्यक्ति पहला परिणाम जिसका रिटर्न compareX
मूल्य के बराबर है input_expression
।
खोजा गया CASE अभिव्यक्ति पहला परिणाम देता है जिसकी conditionX
x सही है।
खोज में चयनित मामला (एक बूलियन अभिव्यक्ति से मेल खाता है)
खोजे गए परिणाम तब आते हैं जब बूलियन अभिव्यक्ति TRUE होती है।
(यह साधारण मामले से अलग है, जो केवल एक इनपुट के साथ तुल्यता के लिए जांच कर सकता है।)
SELECT Id, ItemId, Price,
CASE WHEN Price < 10 THEN 'CHEAP'
WHEN Price < 20 THEN 'AFFORDABLE'
ELSE 'EXPENSIVE'
END AS PriceRating
FROM ItemSales
ईद | सामान आईडी | कीमत | PriceRating |
---|---|---|---|
1 | 100 | 34.5 | महंगी |
2 | 145 | 2.3 | कम |
3 | 100 | 34.5 | महंगी |
4 | 100 | 34.5 | महंगी |
5 | 145 | 10 | किफायती |
किसी शर्त से मेल खाने वाली पंक्तियों की संख्या का पता लगाने के लिए CASE का उपयोग करें।
उदाहरण
CASE
का उपयोग SUM
के साथ संयोजन के रूप में किया जा सकता है ताकि पूर्व-निर्धारित स्थिति से मेल खाते हुए केवल उन वस्तुओं की गिनती हो सके। (यह एक्सेल में COUNTIF
समान है।)
चाल मैचों का संकेत देने वाले द्विआधारी परिणाम वापस करने के लिए है, इसलिए मिलान प्रविष्टियों के लिए लौटाए गए "1" मैच की कुल संख्या की गणना के लिए अभिव्यक्त किया जा सकता है।
इस तालिका ItemSales
को देखते हुए, ItemSales
लें कि आप उन मदों की कुल संख्या सीखना चाहते हैं जिन्हें "महंगी" के रूप में वर्गीकृत किया गया है:
ईद | सामान आईडी | कीमत | PriceRating |
---|---|---|---|
1 | 100 | 34.5 | महंगी |
2 | 145 | 2.3 | कम |
3 | 100 | 34.5 | महंगी |
4 | 100 | 34.5 | महंगी |
5 | 145 | 10 | किफायती |
सवाल
SELECT
COUNT(Id) AS ItemsCount,
SUM ( CASE
WHEN PriceRating = 'Expensive' THEN 1
ELSE 0
END
) AS ExpensiveItemsCount
FROM ItemSales
परिणाम:
ItemsCount | ExpensiveItemsCount |
---|---|
5 | 3 |
वैकल्पिक:
SELECT
COUNT(Id) as ItemsCount,
SUM (
CASE PriceRating
WHEN 'Expensive' THEN 1
ELSE 0
END
) AS ExpensiveItemsCount
FROM ItemSales
आशुलिपि में चयन करें
CASE
का शॉर्टहैंड वेरिएंट मूल्यों की एक श्रृंखला के विरुद्ध एक अभिव्यक्ति (आमतौर पर एक कॉलम) का मूल्यांकन करता है। यह संस्करण थोड़ा छोटा है, और बार-बार मूल्यांकन की गई अभिव्यक्ति को दोहराता है। ELSE
क्लॉज का उपयोग अभी भी किया जा सकता है, हालांकि:
SELECT Id, ItemId, Price,
CASE Price WHEN 5 THEN 'CHEAP'
WHEN 15 THEN 'AFFORDABLE'
ELSE 'EXPENSIVE'
END as PriceRating
FROM ItemSales
चेतावनी। यह समझना महत्वपूर्ण है कि लघु संस्करण का उपयोग करते समय पूरे कथन का मूल्यांकन प्रत्येक WHEN
पर किया जाता है। इसलिए निम्नलिखित कथन:
SELECT
CASE ABS(CHECKSUM(NEWID())) % 4
WHEN 0 THEN 'Dr'
WHEN 1 THEN 'Master'
WHEN 2 THEN 'Mr'
WHEN 3 THEN 'Mrs'
END
एक उत्पादन हो सकता है NULL
परिणाम। ऐसा इसलिए है क्योंकि प्रत्येक WHEN
NEWID()
को एक नए परिणाम के साथ फिर से बुलाया जा रहा है। के बराबर:
SELECT
CASE
WHEN ABS(CHECKSUM(NEWID())) % 4 = 0 THEN 'Dr'
WHEN ABS(CHECKSUM(NEWID())) % 4 = 1 THEN 'Master'
WHEN ABS(CHECKSUM(NEWID())) % 4 = 2 THEN 'Mr'
WHEN ABS(CHECKSUM(NEWID())) % 4 = 3 THEN 'Mrs'
END
इसलिए यह सभी WHEN
मामलों को याद कर सकता है और NULL
रूप में परिणाम कर सकता NULL
।
एक खंड आदेश में मामला
आदेश के प्रकार को निर्धारित करने के लिए हम 1,2,3 का उपयोग कर सकते हैं:
SELECT * FROM DEPT
ORDER BY
CASE DEPARTMENT
WHEN 'MARKETING' THEN 1
WHEN 'SALES' THEN 2
WHEN 'RESEARCH' THEN 3
WHEN 'INNOVATION' THEN 4
ELSE 5
END,
CITY
आईडी | क्षेत्र | FARIDABAD | विभाग | EMPLOYEES_NUMBER |
---|---|---|---|---|
12 | न्यू इंग्लैंड | बोस्टान | विपणन | 9 |
15 | पश्चिम | सैन फ्रांसिस्को | विपणन | 12 |
9 | मिडवेस्ट | शिकागो | बिक्री | 8 |
14 | मध्य अटलांटिक | न्यूयॉर्क | बिक्री | 12 |
5 | पश्चिम | लॉस एंजिलस | अनुसंधान | 1 1 |
10 | मध्य अटलांटिक | फिलाडेल्फिया | अनुसंधान | 13 |
4 | मिडवेस्ट | शिकागो | नवाचार | 1 1 |
2 | मिडवेस्ट | डेट्रायट | मानव संसाधन | 9 |
UPDATE में CASE का उपयोग करना
मूल्य वृद्धि पर नमूना:
UPDATE ItemPrice
SET Price = Price *
CASE ItemId
WHEN 1 THEN 1.05
WHEN 2 THEN 1.10
WHEN 3 THEN 1.15
ELSE 1.00
END
अंतिम आदेश दिए गए NULL मान के लिए CASE उपयोग
इस तरह से ज्ञात मूल्यों का प्रतिनिधित्व करने वाले '0' को पहले स्थान पर रखा गया है, '1' को NULL मानों का प्रतिनिधित्व करते हुए अंतिम रूप से क्रमबद्ध किया गया है:
SELECT ID
,REGION
,CITY
,DEPARTMENT
,EMPLOYEES_NUMBER
FROM DEPT
ORDER BY
CASE WHEN REGION IS NULL THEN 1
ELSE 0
END,
REGION
आईडी | क्षेत्र | FARIDABAD | विभाग | EMPLOYEES_NUMBER |
---|---|---|---|---|
10 | मध्य अटलांटिक | फिलाडेल्फिया | अनुसंधान | 13 |
14 | मध्य अटलांटिक | न्यूयॉर्क | बिक्री | 12 |
9 | मिडवेस्ट | शिकागो | बिक्री | 8 |
12 | न्यू इंग्लैंड | बोस्टान | विपणन | 9 |
5 | पश्चिम | लॉस एंजिलस | अनुसंधान | 1 1 |
15 | शून्य | सैन फ्रांसिस्को | विपणन | 12 |
4 | शून्य | शिकागो | नवाचार | 1 1 |
2 | शून्य | डेट्रायट | मानव संसाधन | 9 |
2 कॉलम के सबसे कम मूल्य द्वारा रिकॉर्ड को सॉर्ट करने के लिए आदेश द्वारा आदेश में मामला
कल्पना करें कि आपको दो कॉलमों में से किसी एक के न्यूनतम मूल्य के आधार पर सॉर्ट रिकॉर्ड की आवश्यकता है। कुछ डेटाबेस इसके लिए एक गैर-एकत्रित MIN()
या LEAST()
फ़ंक्शन का उपयोग कर सकते हैं ... ORDER BY MIN(Date1, Date2)
( ... ORDER BY MIN(Date1, Date2)
), लेकिन मानक SQL में, आपको एक CASE
अभिव्यक्ति का उपयोग करना होगा।
नीचे दी गई क्वेरी में CASE
अभिव्यक्ति Date1
और Date2
कॉलम को Date1
है, यह Date1
है कि किस कॉलम का मूल्य कम है, और इस मान के आधार पर रिकॉर्ड Date2
करता है।
नमूना डेटा
ईद | तिथि 1 | तिथि 2 |
---|---|---|
1 | 2017/01/01 | 2017/01/31 |
2 | 2017/01/31 | 2017/01/03 |
3 | 2017/01/31 | 2017/01/02 |
4 | 2017/01/06 | 2017/01/31 |
5 | 2017/01/31 | 2017/01/05 |
6 | 2017/01/04 | 2017/01/31 |
सवाल
SELECT Id, Date1, Date2
FROM YourTable
ORDER BY CASE
WHEN COALESCE(Date1, '1753-01-01') < COALESCE(Date2, '1753-01-01') THEN Date1
ELSE Date2
END
परिणाम
ईद | तिथि 1 | तिथि 2 |
---|---|---|
1 | 2017/01/01 | 2017/01/31 |
3 | 2017/01/31 | 2017/01/02 |
2 | 2017/01/31 | 2017/01/03 |
6 | 2017/01/04 | 2017/01/31 |
5 | 2017/01/31 | 2017/01/05 |
4 | 2017/01/06 | 2017/01/31 |
व्याख्या
आप के साथ पंक्ति देख Id = 1
है कि क्योंकि, पहला है Date1
पूरे मेज से सबसे कम रिकार्ड है 2017-01-01
, पंक्ति जहां Id = 3
कि क्योंकि दूसरे स्थान पर है Date2
के बराबर 2017-01-02
है कि मेज से दूसरी सबसे कम मूल्य और इसी तरह।
इसलिए हमने 2017-01-01
लेकर 2017-01-06
तक के रिकॉर्ड को क्रमबद्ध किया है और इस पर कोई ध्यान नहीं दिया है कि Date1
या Date2
कौन से कॉलम हैं।