Để tìm các hàng mà hai cột có giá trị **khác nhau** (bao gồm cả trường hợp một cột NULL, cột kia không NULL), bạn cần xử lý riêng cho NULL vì NULL != NULL và NULL != 10 đều trả về UNKNOWN (không phải TRUE).
Cú pháp đầy đủ
SELECT * FROM ten_bang
WHERE cot1 != cot2
OR (cot1 IS NULL AND cot2 IS NOT NULL)
OR (cot2 IS NULL AND cot1 IS NOT NULL);
Ví dụ minh họa
1. Tạo bảng
CREATE TABLE selectTwoColumns (
Id INT NOT NULL AUTO_INCREMENT,
FirstNumber INT,
SecondNumber INT,
PRIMARY KEY(Id)
);
2. Chèn dữ liệu (có NULL)
INSERT INTO selectTwoColumns(FirstNumber, SecondNumber) VALUES
(10, 20), (30, 40), (20, 20), (50, 60), (50, 50), (70, NULL);
3. Xem dữ liệu
SELECT * FROM selectTwoColumns;
Kết quả:
+----+-------------+--------------+
| Id | FirstNumber | SecondNumber |
+----+-------------+--------------+
| 1 | 10 | 20 |
| 2 | 30 | 40 |
| 3 | 20 | 20 |
| 4 | 50 | 60 |
| 5 | 50 | 50 |
| 6 | 70 | NULL |
+----+-------------+--------------+
4. Truy vấn: Hai cột KHÔNG cùng giá trị
SELECT * FROM selectTwoColumns
WHERE FirstNumber != SecondNumber
OR (FirstNumber IS NULL AND SecondNumber IS NOT NULL)
OR (SecondNumber IS NULL AND FirstNumber IS NOT NULL);
Kết quả:
+----+-------------+--------------+
| Id | FirstNumber | SecondNumber |
+----+-------------+--------------+
| 1 | 10 | 20 |
| 2 | 30 | 40 |
| 4 | 50 | 60 |
| 6 | 70 | NULL |
+----+-------------+--------------+
Hàng 3 (20=20) và hàng 5 (50=50) bị loại. Hàng 6 (70 vs NULL) được chọn nhờ điều kiện IS NULL.
Cách viết gọn hơn (MySQL)
MySQL hỗ trợ toán tử <=> (NULL-safe equal) - trả về TRUE/FALSE, không bao giờ NULL:
-- Cách 1: NOT (cot1 <=> cot2) -- Khác nhau (có xử lý NULL)
SELECT * FROM selectTwoColumns WHERE NOT (FirstNumber <=> SecondNumber);
-- Cách 2: COALESCE so sánh
SELECT * FROM selectTwoColumns WHERE COALESCE(FirstNumber, -999999) != COALESCE(SecondNumber, -999999);
-- Cần giá trị sentinel chắc chắn không xuất hiện trong dữ liệu
So sánh các toán tử
| Biểu thức | 10 vs 20 | 20 vs 20 | 70 vs NULL | NULL vs NULL |
|---|---|---|---|---|
a != b | TRUE | FALSE | UNKNOWN | UNKNOWN |
a = b | FALSE | TRUE | UNKNOWN | UNKNOWN |
a <=> b | FALSE | TRUE | FALSE | TRUE |
NOT (a <=> b) | TRUE | FALSE | TRUE | FALSE |
Khuyến nghị
- Dùng
NOT (cot1 <=> cot2)- ngắn gọn, chuẩn MySQL, xử lý đúng NULL - Nếu cần chuẩn SQL (portable): dùng 3 điều kiện OR như ví dụ chính
- Luôn test case NULL khi so sánh cột có thể NULL