MySQL
विरल या अनुपस्थित डेटा से निपटना
खोज…
पूर्ण मानों के विपरीत स्तंभों के साथ कार्य करना
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
मानों के साथ काम करने के कुछ उदाहरण हैं।