मुख्य सामग्री पर जाएं
मॉड्यूल 4 · पाठ 3 का 4पाठ्यक्रम में 15/57~10 min
मॉड्यूल पाठ (3/4)

सशर्त तर्क: मामला कब

अब तक हमने जो कुछ भी देखा है वह डेटा को वैसे ही निकालता है जैसे वह है। हालाँकि, अक्सर, आप चाहते हैं इसे परिवर्तित करने के लिए: वेतन को स्तरों में वर्गीकृत करें, नई नियुक्तियों को इस प्रकार चिह्नित करें "जूनियर", एक संख्यात्मक कोड को एक पठनीय लेबल में अनुवादित करें। SQL का मानक इसके लिए टूल को CASE WHEN कहा जाता है।

वाक्यविन्यास: एक मिनी यदि/अन्यथा

SQL
CASE
  WHEN condition_1 THEN value_1
  WHEN condition_2 THEN value_2
  ...
  ELSE default_value
END

यह बिल्कुल किसी भी भाषा में if/else if/else की तरह पढ़ता है: SQL मूल्यांकन करता है स्थितियाँ क्रम में और पहले सत्य पर रुकती है, वापस लौटती है संगत value। यदि कोई भी सत्य नहीं है, तो यह ELSE मान लौटाता है। यदि आप ELSE को हटा दें और कोई शाखा मेल नहीं खाती, तो यह NULL लौटाता है।

SQL
-- Classify employees by salary tier:
SELECT first_name,
       last_name,
       salary,
       CASE
         WHEN salary >= 50000 THEN 'Senior'
         WHEN salary >= 35000 THEN 'Mid'
         ELSE                       'Junior'
       END AS tier
FROM   employees;

CASE SELECT के अंदर रहता है: यह किसी अन्य की तरह ही एक कॉलम तैयार करता है फ़ंक्शन, और इसे AS (यहां) के साथ उपनाम देना बिल्कुल सामान्य है tier).

CASE का उपयोग कहां करें

तीन आवर्ती स्थान:

  1. SELECT में व्युत्पन्न कॉलम बनाने के लिए (उपरोक्त उदाहरण)।
  2. "कस्टम" सॉर्टिंग के लिए ORDER BY में:
    SQL
    ORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name;
    -- Engineering first, then the rest, alphabetically by last name.
  3. कुल कार्यों के अंदर "सशर्त रूप से गिनें":
    SQL
    SELECT
      COUNT(*) AS total,
      SUM(CASE WHEN salary >= 50000 THEN 1 ELSE 0 END) AS senior,
      SUM(CASE WHEN salary <  35000 THEN 1 ELSE 0 END) AS junior
    FROM employees;
    यह पैटर्न - SUM(CASE WHEN … THEN 1 ELSE 0 END) - सबसे आम है डैशबोर्ड में "सशर्त गणना" का उपयोग किया जाता है।

"कॉम्पैक्ट" रूप

जब आप एकल अभिव्यक्ति की तुलना करते हैं तो इसका एक छोटा संस्करण भी होता है सटीक मानों के विरुद्ध:

SQL
CASE department_id
  WHEN 1 THEN 'Ingegneria'
  WHEN 2 THEN 'Vendite'
  ELSE       'Altro'
END

यह CASE WHEN department_id = 1 THEN ... WHEN department_id = 2 THEN ... END के बराबर है, बस अधिक कॉम्पैक्ट। यह केवल सटीक समानता के लिए काम करता है: यदि आपको >= या किसी अन्य तुलना की आवश्यकता है, आपको विस्तारित पर वापस जाना होगा प्रपत्र.

इसे अजमाएं

व्यायाम#sql.m4.l3.e1
प्रयास: 0लोड हो रहा है...

प्रत्येक कर्मचारी के लिए, पहला नाम (प्रथम_नाम), अंतिम नाम (अंतिम_नाम) और एक 'टियर' कॉलम दिखाएं जो कि 'ऑल्टो' है यदि वेतन कम से कम 50000 है, अन्यथा 'मानक'। तीन कॉलम, प्रति कर्मचारी एक पंक्ति।

संपादक लोड हो रहा है...
संकेत दिखाएँ

शर्त वेतन >= 50000 है। CASE को END के साथ बंद करना और उपनाम 'टियर' का उपयोग करना याद रखें।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम की समीक्षा करें

व्यायाम#sql.m4.l3.e2
प्रयास: 0लोड हो रहा है...

प्रत्येक विभाग (विभाग_आईडी) के लिए, SUM(CASE...) का उपयोग करके गणना करें कि कितने कर्मचारियों का वेतन उच्च है (>= 50000) और कितने कर्मचारियों का मानक वेतन (< 50000) है। तीन कॉलम: विभाग_आईडी, उच्च, मानक। विभाग_आईडी द्वारा आदेश (अंतिम शून्य)।

संपादक लोड हो रहा है...
संकेत दिखाएँ

योग (मामला जब ... तब 1 अन्य 0 अंत) पैटर्न सशर्त गणना है।

3 प्रयासों के बाद समाधान उपलब्ध है