MySQL में NULL मानों की मौजूदगी में NOT EQUAL (<>) तुलना की समस्या और समाधान
समस्या:
SQL में NULL <> value का परिणाम NULL होता है (TRUE नहीं), क्योंकि NULL "अज्ञात" है। इसलिए WHERE col <> 2 उन पंक्तियों को बाहर कर देगा जहां col NULL है।
समाधान: IS NOT NULL या IS NULL उपयोग करें
व्यावहारिक उदाहरण
1. टेबल बनाएं (NULL मानों के साथ):
mysql> CREATE TABLE IsNullDemo (
-> ProductId INT,
-> ProductName VARCHAR(100),
-> ProductBackOrder INT
-> );
Query OK, 0 rows affected (0.54 sec)
2. डेटा डालें (कुछ NULL):
mysql> INSERT INTO IsNullDemo VALUES(100,'First-Product',NULL); mysql> INSERT INTO IsNullDemo VALUES(101,'Second-Product',2); mysql> INSERT INTO IsNullDemo VALUES(102,'Third-Product',NULL); mysql> INSERT INTO IsNullDemo VALUES(103,'Fourth-Product',4); mysql> INSERT INTO IsNullDemo VALUES(104,'Fifth-Product',10); mysql> INSERT INTO IsNullDemo VALUES(105,'Sixth-Product',NULL);
3. सभी रिकॉर्ड:
+-----------+----------------+------------------+ | ProductId | ProductName | ProductBackOrder | +-----------+----------------+------------------+ | 100 | First-Product | NULL | | 101 | Second-Product | 2 | | 102 | Third-Product | NULL | | 103 | Fourth-Product | 4 | | 104 | Fifth-Product | 10 | | 105 | Sixth-Product | NULL | +-----------+----------------+------------------+ 6 rows in set (0.00 sec)
केस 1: NULL को बाहर रखें (नॉन-NULL और ≠ 2):
mysql> SELECT * FROM IsNullDemo
-> WHERE ProductBackOrder IS NOT NULL OR ProductBackOrder <> 2;
+-----------+----------------+------------------+ | ProductId | ProductName | ProductBackOrder | +-----------+----------------+------------------+ | 101 | Second-Product | 2 | | 103 | Fourth-Product | 4 | | 104 | Fifth-Product | 10 | +-----------+----------------+------------------+ 3 rows in set (0.03 sec)
नोट: IS NOT NULL OR <> 2 का अर्थ है "या तो NULL नहीं है, या 2 नहीं है" — लेकिन चूंकि 2 NULL नहीं है, यह शामिल हो जाता है।
केस 2: NULL को शामिल करें (NULL या ≠ 2):
mysql> SELECT * FROM IsNullDemo
-> WHERE ProductBackOrder IS NULL OR ProductBackOrder <> 2;
+-----------+----------------+------------------+ | ProductId | ProductName | ProductBackOrder | +-----------+----------------+------------------+ | 100 | First-Product | NULL | | 102 | Third-Product | NULL | | 103 | Fourth-Product | 4 | | 104 | Fifth-Product | 10 | | 105 | Sixth-Product | NULL | +-----------+----------------+------------------+ 5 rows in set (0.00 sec)
सही लॉजिक के लिए पैटर्न:
| इरादा | सही WHERE क्लॉज |
|---|---|
| मान 2 नहीं है (NULL बाहर) | col IS NOT NULL AND col <> 2 |
| मान 2 नहीं है (NULL शामिल) | col IS NULL OR col <> 2 |
| मान 2 है (NULL बाहर) | col = 2 |
| मान 2 है या NULL है | col = 2 OR col IS NULL |
NULL-सेफ तुलना ऑपरेटर (MySQL):