मूल समस्या: NULL तुलना
SQL में NULL "अज्ञात मान" दर्शाता है। किसी भी मान की तुलना NULL से (यहां तक कि NULL से भी) मानक तुलना ऑपरेटर्स (=, <>, <, >, आदि) का उपयोग करके NULL (सत्य/असत्य नहीं) लौटाती है।
<> ऑपरेटर के साथ तुलना (हमेशा NULL)
mysql> SELECT 10 <> NULL; +------------+ | 10 <> NULL | +------------+ | NULL | +------------+ mysql> SELECT NULL <> NULL; +--------------+ | NULL <> NULL | +--------------+ | NULL | +--------------+ mysql> SELECT 'Chris' <> NULL; +-----------------+ | 'Chris' <> NULL | +-----------------+ | NULL | +-----------------+ mysql> SELECT '' <> NULL; +------------+ | '' <> NULL | +------------+ | NULL | +------------+
परिणाम: सभी NULL लौटाते हैं - कोई पंक्ति मेल नहीं खाती।
टेबल उदाहरण
mysql> CREATE TABLE DemoTable846(Value INT); Query OK, 0 rows affected (0.93 sec) mysql> INSERT INTO DemoTable846 VALUES(NULL),(10); Query OK, 2 rows affected (...) mysql> SELECT * FROM DemoTable846;
+-------+ | Value | +-------+ | NULL | | 10 | +-------+ 2 rows in set (0.00 sec)
IS NOT NULL ऑपरेटर (सही तरीका)
mysql> SELECT * FROM DemoTable846 WHERE Value IS NOT NULL;
परिणाम
+-------+ | Value | +-------+ | 10 | +-------+ 1 row in set (0.00 sec)
<> NULL का उपयोग (गलत तरीका)
mysql> SELECT * FROM DemoTable846 WHERE Value <> NULL;
परिणाम
Empty set (0.00 sec)
क्यों?
NULLका अर्थ "अज्ञात" है10 <> NULL→ "क्या 10 अज्ञात मान से अलग है?" → "अज्ञात" (NULL)NULL <> NULL→ "क्या अज्ञात, अज्ञात से अलग है?" → "अज्ञात" (NULL)- WHERE क्लॉज केवल
TRUEवाली पंक्तियां लौटाता है,NULLयाFALSEनहीं
सही NULL जांच
| जांच | सही सिंटैक्स | गलत सिंटैक्स |
|---|---|---|
| NULL है | IS NULL | = NULL |
| NULL नहीं है | IS NOT NULL | <> NULL, != NULL |
NULL-सेफ इक्वलिटी ऑपरेटर: <=>
mysql> SELECT NULL <=> NULL; -- 1 (सत्य) mysql> SELECT 10 <=> NULL; -- 0 (असत्य) mysql> SELECT 'a' <=> 'a'; -- 1 (सत्य)
<=>(NULL-सेफ इक्वल) NULL को सामान्य मान की तरह मानता हैNULL <=> NULLसत्य (1) हैWHERE col <=> NULLWHERE col IS NULLके समान
COALESCE/IFNULL से तुलना
-- गैर-NULL मानों के लिए WHERE COALESCE(Value, -1) <> -1 -- Value IS NOT NULL के समान -- लेकिन IS NOT NULL अधिक पठनीय और इंडेक्स-फ्रेंडली है
सारांश
IS NULL / IS NOT NULL (या <=>) का उपयोग करें। = NULL, <> NULL, != NULL कभी काम नहीं करते।