खोज…


पूर्ण मानों के विपरीत स्तंभों के साथ कार्य करना

MySQL और अन्य SQL बोलियों में, NULL मान के विशेष गुण हैं।

नौकरी आवेदकों के लिए निम्नलिखित तालिका पर विचार करें, जिन कंपनियों के लिए उन्होंने काम किया था, और जिस तारीख को उन्होंने कंपनी छोड़ दी थी। NULL बताता है कि एक आवेदक अभी भी कंपनी में काम करता है:

CREATE TABLE example
(`applicant_id` INT, `company_name` VARCHAR(255), `end_date` DATE);

+--------------+-----------------+------------+
| applicant_id | company_name    | end_date   |
+--------------+-----------------+------------+
|            1 | Google          | NULL       |
|            1 | Initech         | 2013-01-31 |
|            2 | Woodworking.com | 2016-08-25 |
|            2 | NY Times        | 2013-11-10 |
|            3 | NFL.com         | 2014-04-13 |
+--------------+-----------------+------------+

आपका कार्य एक ऐसी क्वेरी की रचना करना है जो 2016-01-01 बाद सभी पंक्तियों को लौटाती है, जिसमें कोई भी कर्मचारी जो अभी भी एक कंपनी में काम कर रहे हैं (जिनके पास NULL अंतिम तिथियां हैं)। यह चयन कथन:

SELECT * FROM example WHERE end_date > '2016-01-01';

NULL मानों वाली किसी भी पंक्तियों को शामिल करने में विफल:

+--------------+-----------------+------------+
| applicant_id | company_name    | end_date   |
+--------------+-----------------+------------+
|            2 | Woodworking.com | 2016-08-25 |
+--------------+-----------------+------------+

MySQL प्रलेखन के अनुसार , अंकगणितीय संचालकों का उपयोग कर तुलना <,>, =, और <> खुद बूलियन TRUE या FALSE बजाय NULL को लौटाते हैं। इस प्रकार NULL end_date के साथ एक पंक्ति न तो 2016-01-01 से अधिक है और न ही 2016-01-01 से कम है।

इसे IS NULL कीवर्ड का उपयोग करके हल किया जा सकता है:

SELECT * FROM example WHERE end_date > '2016-01-01' OR end_date IS NULL;

+--------------+-----------------+------------+
| applicant_id | company_name    | end_date   |
+--------------+-----------------+------------+
|            1 | Google          | NULL       |
|            2 | Woodworking.com | 2016-08-25 |
+--------------+-----------------+------------+

NULLs के साथ कार्य करना तब और अधिक जटिल हो जाता है जब कार्य में MAX() और GROUP BY खंड जैसे एकत्रीकरण कार्य शामिल होते हैं। यदि आपका कार्य प्रत्येक आवेदक के लिए सबसे हाल ही में नियोजित तिथि का चयन करने के लिए था, तो निम्नलिखित प्रश्न तार्किक रूप से पहला प्रयास होगा:

SELECT applicant_id, MAX(end_date) FROM example GROUP BY applicant_id;

+--------------+---------------+
| applicant_id | MAX(end_date) |
+--------------+---------------+
|            1 | 2013-01-31    |
|            2 | 2016-08-25    |
|            3 | 2014-04-13    |
+--------------+---------------+

हालांकि, यह जानते हुए कि NULL इंगित करता है कि एक आवेदक अभी भी एक कंपनी में कार्यरत है, परिणाम की पहली पंक्ति गलत है। CASE WHEN का उपयोग करते हुए NULL समस्या के लिए समाधान प्रदान करता है:

 SELECT
    applicant_id,
    CASE WHEN MAX(end_date is null) = 1 THEN 'present' ELSE MAX(end_date) END
    max_date
FROM example
GROUP BY applicant_id;

+--------------+------------+
| applicant_id | max_date   |
+--------------+------------+
|            1 | present    |
|            2 | 2016-08-25 |
|            3 | 2014-04-13 |
+--------------+------------+

यह परिणाम मूल example तालिका में उस कंपनी को निर्धारित करने के example वापस जोड़ा जा सकता है जिस पर एक आवेदक ने अंतिम काम किया था:

SELECT 
  data.applicant_id,
  data.company_name,
  data.max_date
FROM (
  SELECT 
    *,
    CASE WHEN end_date is null THEN 'present' ELSE end_date END max_date
  FROM example
) data
INNER JOIN (
 SELECT
   applicant_id,
   CASE WHEN MAX(end_date is null) = 1 THEN 'present' ELSE MAX(end_date) END max_date
 FROM
   example
 GROUP BY applicant_id
) j
ON data.applicant_id = j.applicant_id AND data.max_date = j.max_date;

+--------------+-----------------+------------+
| applicant_id | company_name    | max_date   |
+--------------+-----------------+------------+
|            1 | Google          | present    |
|            2 | Woodworking.com | 2016-08-25 |
|            3 | NFL.com         | 2014-04-13 |
+--------------+-----------------+------------+

ये MySQL में NULL मानों के साथ काम करने के कुछ उदाहरण हैं।



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