การกรองข้อมูลที่มี NULL และค่าปกติด้วยเงื่อนไข AND/OR
เมื่อคอลัมน์มีค่า NULL ปนอยู่กับค่าปกติ การเปรียบเทียบ != จะไม่จับค่า NULL ได้ (เพราะ NULL != 20 เป็น UNKNOWN) จึงต้องเพิ่มเงื่อนไข IS NULL เข้าไปด้วย
สร้างตารางและเพิ่มข้อมูล
mysql> CREATE TABLE DemoTable (value1 INT, value2 INT, value3 INT);
Query OK, 0 rows affected (0.70 sec)
mysql> INSERT INTO DemoTable VALUES(20, 40, NULL);
mysql> INSERT INTO DemoTable VALUES(40, 40, NULL);
mysql> INSERT INTO DemoTable VALUES(NULL, NULL, NULL);
แสดงข้อมูลทั้งหมด
mysql> SELECT * FROM DemoTable;
ผลลัพธ์:
+--------+--------+--------+
| value1 | value2 | value3 |
+--------+--------+--------+
| 20 | 40 | NULL |
| 40 | 40 | NULL |
| NULL | NULL | NULL |
+--------+--------+--------+
3 rows in set (0.00 sec)
คำสั่งกรอง: ทุกคอลัมน์ต้อง (เป็น NULL OR ไม่เท่ากับ 20)
mysql> SELECT * FROM DemoTable
WHERE (value1 IS NULL OR value1 != 20)
AND (value2 IS NULL OR value2 != 20)
AND (value3 IS NULL OR value3 != 20);
ผลลัพธ์:
+--------+--------+--------+
| value1 | value2 | value3 |
+--------+--------+--------+
| 40 | 40 | NULL |
| NULL | NULL | NULL |
+--------+--------+--------+
2 rows in set (0.00 sec)
คำอธิบาย
- แถวแรก: value1=20 →
value1 != 20เท็จ,value1 IS NULLเท็จ → ทั้งเงื่อนไข value1 เท็จ → แถวถูกตัด - แถวสอง: value1=40 (!=20 จริง), value2=40 (!=20 จริง), value3=NULL (IS NULL จริง) → ผ่านทั้ง 3 → เลือก
- แถวสาม: ทุกคอลัมน์ NULL → IS NULL จริงทุกอัน → ผ่าน → เลือก
- หลักการ:
(col IS NULL OR col != val)เทียบเท่าNOT (col = val)แต่รองรับ NULL