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

Kiểm tra cột rỗng (empty string) hoặc NULL trong MySQL

Trong MySQL, NULL (chưa có giá trị) và '' (chuỗi rỗng) là **hai giá trị hoàn toàn khác nhau**. Cần kiểm tra riêng biệt từng trường hợp.

Cú pháp kiểm tra toàn diện (CASE WHEN)

SELECT *,
    CASE 
        WHEN ten_cot = '' THEN 'Rỗng (empty string)'
        WHEN ten_cot IS NULL THEN 'NULL'
        ELSE CONCAT(ten_cot, ' là giá trị hợp lệ')
    END AS TrangThai
FROM ten_bang;

Ví dụ minh họa

1. Tạo bảng

CREATE TABLE checkFieldDemo (
    Id INT NOT NULL AUTO_INCREMENT,
    Name VARCHAR(10),
    PRIMARY KEY(Id)
);

2. Chèn dữ liệu (có NULL và chuỗi rỗng)

INSERT INTO checkFieldDemo(Name) VALUES(NULL);
INSERT INTO checkFieldDemo(Name) VALUES('John');
INSERT INTO checkFieldDemo(Name) VALUES(NULL);
INSERT INTO checkFieldDemo(Name) VALUES('');     -- Chuỗi rỗng
INSERT INTO checkFieldDemo(Name) VALUES('Carol');
INSERT INTO checkFieldDemo(Name) VALUES('');     -- Chuỗi rỗng
INSERT INTO checkFieldDemo(Name) VALUES(NULL);

3. Xem dữ liệu gốc

SELECT * FROM checkFieldDemo;

Kết quả:

+----+-------+
| Id | Name  |
+----+-------+
| 1  | NULL  |
| 2  | John  |
| 3  | NULL  |
| 4  |       |  -- Chuỗi rỗng (hiển thị trống)
| 5  | Carol |
| 6  |       |  -- Chuỗi rỗng
| 7  | NULL  |
+----+-------+

4. Phân loại từng hàng

SELECT *,
    CASE 
        WHEN Name = '' THEN 'It is an empty string'
        WHEN Name IS NULL THEN 'It is a NULL value'
        ELSE CONCAT(Name, ' is a Name')
    END AS ListOfValues
FROM checkFieldDemo;

Kết quả:

+----+-------+-----------------------+
| Id | Name  | ListOfValues          |
+----+-------+-----------------------+
| 1  | NULL  | It is a NULL value    |
| 2  | John  | John is a Name        |
| 3  | NULL  | It is a NULL value    |
| 4  |       | It is an empty string |
| 5  | Carol | Carol is a Name       |
| 6  |       | It is an empty string |
| 7  | NULL  | It is a NULL value    |
+----+-------+-----------------------+

Các cách kiểm tra khác

1. WHERE: Lọc hàng NULL HOẶC rỗng

-- Cả NULL và ''
SELECT * FROM bang WHERE ten_cot IS NULL OR ten_cot = '';

-- Chỉ NULL
SELECT * FROM bang WHERE ten_cot IS NULL;

-- Chỉ rỗng
SELECT * FROM bang WHERE ten_cot = '';

2. WHERE: Lọc hàng KHÔNG NULL VÀ KHÔNG rỗng

SELECT * FROM bang WHERE ten_cot IS NOT NULL AND ten_cot != '';

3. COALESCE gộp NULL và rỗng thành một giá trị

-- NULL → 'N/A', '' → 'N/A', khác → giữ nguyên
SELECT COALESCE(NULLIF(ten_cot, ''), 'N/A') FROM bang;

4. LENGTH() / CHAR_LENGTH() phát hiện rỗng

-- Chuỗi rỗng: LENGTH = 0
-- NULL: LENGTH = NULL
SELECT * FROM bang WHERE LENGTH(TRIM(ten_cot)) = 0 OR ten_cot IS NULL;

So sánh NULL vs Empty String

Đặc điểmNULLEmpty String ('')
Ý nghĩaChưa biết, thiếu dữ liệuBiết chắc là "không có gì"
So sánh =NULL = NULL → NULL (UNKNOWN)'' = '' → TRUE
IS NULLTRUEFALSE
= ''FALSE (NULL != '')TRUE
COUNT(cot)Không đếmĐếm
CONCATKết quả NULLKết quả chuỗi khác

Best Practice

  • Chuẩn hóa: Chỉ cho phép **một trong hai** (NULL HOẶC rỗng), không nên có cả hai
  • Dùng NOT NULL DEFAULT '' cho cột bắt buộc nhưng có thể "không có giá trị"
  • Dùng NULL cho cột tùy chọn thực sự (có thể không áp dụng)
  • Khi UPDATE: SET cot = NULLIF(TRIM(cot), '') để chuẩn hóa rỗng → NULL