ปัญหา: NULL ไม่เท่ากับอะไรเลย (รวมถึงไม่เท่ากับ NULL)
ใน SQL มาตรฐาน NULL <> value คืนค่า UNKNOWN (ไม่ใช่ TRUE/FALSE) ทำให้ WHERE ไม่จับคู่
ตัวอย่างปัญหา
mysql> CREATE TABLE IsNullDemo (
-> ProductId INT,
-> ProductName VARCHAR(100),
-> ProductBackOrder INT
-> );
Query OK, 0 rows affected (0.54 sec)
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);
ข้อมูลทั้งหมด
mysql> SELECT * FROM IsNullDemo;
+-----------+----------------+------------------+ | 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 และไม่เท่ากับ 2"
ใช้ IS NOT NULL ร่วมกับ <>
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)
กรณีที่ 2: ต้องการค่าที่ "เป็น NULL หรือไม่เท่ากับ 2"
ใช้ IS NULL ร่วมกับ <>
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)
กฎสำคัญเกี่ยวกับ NULL:
NULL = NULL→ FALSE (ใช้IS NULLแทน)NULL <> NULL→ FALSE (ใช้IS NOT NULLแทน)NULL = 5→ UNKNOWNNULL <> 5→ UNKNOWN- WHERE เลือกเฉพาะ TRUE เท่านั้น UNKNOWN และ FALSE จะถูกตัดทิ้ง
ฟังก์ชันช่วยเหลือ: IFNULL(), COALESCE(), NULLIF(), ISNULL()