เปรียบเทียบคอลัมน์สองคอลัมน์ รวมถึงจัดการ NULL
ใช้ != (หรือ <>) พร้อมเงื่อนไขตรวจสอบ NULL เนื่องจาก NULL != NULL เป็น UNKNOWN ไม่ใช่ TRUE
ไวยากรณ์
SELECT * FROM yourTableName
WHERE col1 != col2
OR (col1 IS NULL AND col2 IS NOT NULL)
OR (col2 IS NULL AND col1 IS NOT NULL);
ตัวอย่างการใช้งาน
สร้างตาราง:
CREATE TABLE selectTwoColumns (
Id INT NOT NULL AUTO_INCREMENT,
FirstNumber INT,
SecondNumber INT,
PRIMARY KEY(Id)
);
เพิ่มข้อมูล (รวม NULL):
INSERT INTO selectTwoColumns(FirstNumber, SecondNumber) VALUES(10, 20);
INSERT INTO selectTwoColumns(FirstNumber, SecondNumber) VALUES(30, 40);
INSERT INTO selectTwoColumns(FirstNumber, SecondNumber) VALUES(20, 20); -- เท่ากัน
INSERT INTO selectTwoColumns(FirstNumber, SecondNumber) VALUES(50, 60);
INSERT INTO selectTwoColumns(FirstNumber, SecondNumber) VALUES(50, 50); -- เท่ากัน
INSERT INTO selectTwoColumns(FirstNumber, SecondNumber) VALUES(70, NULL); -- NULL
ค้นหาแถวที่ค่าต่างกัน:
SELECT * FROM selectTwoColumns
WHERE FirstNumber != SecondNumber
OR (FirstNumber IS NULL AND SecondNumber IS NOT NULL)
OR (SecondNumber IS NULL AND FirstNumber IS NOT NULL);
ผลลัพธ์:
+----+-------------+--------------+
| Id | FirstNumber | SecondNumber |
+----+-------------+--------------+
| 1 | 10 | 20 |
| 2 | 30 | 40 |
| 4 | 50 | 60 |
| 6 | 70 | NULL |
+----+-------------+--------------+
วิธีที่สั้นกว่า (MySQL)
MySQL มี operator <=> (NULL-safe equal) - คืน TRUE/FALSE แม้จะเป็น NULL:
-- ค่าต่างกัน (รวม NULL)
SELECT * FROM selectTwoColumns WHERE NOT (FirstNumber <=> SecondNumber);
-- ค่าเท่ากัน (รวม NULL)
SELECT * FROM selectTwoColumns WHERE FirstNumber <=> SecondNumber;
ตารางความจริงของ <=> (Null-safe equal)
| col1 | col2 | col1 <=> col2 | col1 = col2 |
|---|---|---|---|
| 10 | 10 | TRUE (1) | TRUE (1) |
| 10 | 20 | FALSE (0) | FALSE (0) |
| NULL | NULL | TRUE (1) | NULL (UNKNOWN) |
| NULL | 10 | FALSE (0) | NULL (UNKNOWN) |
สรุป
- ใช้
NOT (col1 <=> col2)สำหรับ "ไม่เท่ากัน" รวม NULL (สั้นและชัดเจน) - ใช้
col1 != col2 OR ...สำหรับความเข้ากันได้กับฐานข้อมูลอื่น - จำไว้:
NULL = NULLเป็น UNKNOWN ไม่ใช่ TRUE