खोज…


परिचय

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 कौन से कॉलम हैं।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow