Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Truy vấn MySQL: Chọn hàng khi 2 cột không có giá trị giống nhau

Để 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ức10 vs 2020 vs 2070 vs NULLNULL vs NULL
a != bTRUEFALSEUNKNOWNUNKNOWN
a = bFALSETRUEUNKNOWNUNKNOWN
a <=> bFALSETRUEFALSETRUE
NOT (a <=> b)TRUEFALSETRUEFALSE

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