Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL NOT EQUAL (<>) ไม่ทำงานกับ NULL: วิธีแก้ไข

ปัญหา: 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 → UNKNOWN
  • NULL <> 5 → UNKNOWN
  • WHERE เลือกเฉพาะ TRUE เท่านั้น UNKNOWN และ FALSE จะถูกตัดทิ้ง

ฟังก์ชันช่วยเหลือ: IFNULL(), COALESCE(), NULLIF(), ISNULL()