Vấn đề
Lọc bỏ cả giá trị NULL và chuỗi rỗng '' khỏi kết quả truy vấn.
Ví dụ
Tạo bảng:
CREATE TABLE DemoTable635 (
EmployeeId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
EmployeeName VARCHAR(100)
);
INSERT INTO DemoTable635(EmployeeName) VALUES
('John'), ('Sam'), (''), (NULL), ('David');
Truy vấn loại trừ NULL và rỗng:
SELECT * FROM DemoTable635
WHERE EmployeeName IS NOT NULL
AND EmployeeName <> '';
Kết quả:
+-----------+--------------+
| EmployeeId | EmployeeName |
+-----------+--------------+
| 1 | John |
| 2 | Sam |
| 5 | David |
+-----------+--------------+
Các cách viết tương đương
-- Cách 1: IS NOT NULL + <> '' (chuẩn, rõ ràng)
WHERE EmployeeName IS NOT NULL AND EmployeeName <> ''
-- Cách 2: COALESCE + <> ''
WHERE COALESCE(EmployeeName, '') <> ''
-- Cách 3: LENGTH > 0 (NULL → NULL, '' → 0, 'a' → 1)
WHERE LENGTH(EmployeeName) > 0
-- Cách 4: TRIM + <> '' (cũng loại bỏ whitespace-only)
WHERE TRIM(EmployeeName) <> ''
-- Cách 5: NOT IN (NULL, '') - CẨN THẬN: NOT IN với NULL trả về UNKNOWN
-- KHÔNG KHUYẾN NGHỊ: WHERE EmployeeName NOT IN (NULL, '')
So sánh
| Cách | Xử lý NULL | Xử lý '' | Xử lý ' ' | Dùng index |
|---|---|---|---|---|
| IS NOT NULL AND <> '' | ✓ | ✓ | ✗ (giữ nguyên) | Có (nếu không function) |
| COALESCE(col,'') <> '' | ✓ | ✓ | ✗ | Khó (function) |
| LENGTH(col) > 0 | ✓ (NULL→NULL) | ✓ | ✗ | Khó |
| TRIM(col) <> '' | ✓ | ✓ | ✓ (loại bỏ) | Khó |
Best Practice
- Dùng
IS NOT NULL AND col <> ''cho WHERE clause (index friendly). - Dùng
TRIM(col) <> ''cho data cleaning (loại cả whitespace-only). - Tạo
CHECK CONSTRAINT(MySQL 8.0.16+):CHECK (EmployeeName IS NOT NULL AND EmployeeName <> ''). - Định nghĩa cột:
EmployeeName VARCHAR(100) NOT NULL DEFAULT ''để tránh NULL từ đầu.