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

Lọc hàng có cột VARCHAR chứa chỉ khoảng trắng (whitespace) trong MySQL

Giới thiệu

Dùng TRIM() loại bỏ khoảng trắng đầu/cuối, kết hợp COALESCE xử lý NULL, để tìm hàng mà cột FirstName thực chất rỗng (chỉ space hoặc NULL).

Ví dụ thực hành

1. Tạo bảng DemoTable826

mysql> CREATE TABLE DemoTable826 (
    FirstName VARCHAR(100),
    Age INT
);

2. Chèn dữ liệu (có hàng FirstName = ' ' — một space)

mysql> INSERT INTO DemoTable826 VALUES (' ',24),(' ',22),('Chris',26),('Robert',27);

Lưu ý: Bài viết gốc output hiển thị 'Adam' nhưng INSERT không có Adam — có thể lỗi copy. Ta tập trung vào logic.

3. Tìm hàng FirstName rỗng/whitespace/NULL

mysql> SELECT * FROM DemoTable826 
    WHERE COALESCE(TRIM(FirstName), '') = '';

4. Kết quả

+-----------+------+
| FirstName | Age  |
+-----------+------+
|           |   24 |
|           |   22 |
+-----------+------+

Giải thích

  • TRIM(FirstName): Xóa space đầu/cuối. ' ' → ''. 'Chris' → 'Chris'.
  • COALESCE(..., ''): Nếu TRIM trả về NULL (do FirstName=NULL) → chuyển thành ''.
  • So sánh = '' bắt cả chuỗi rỗng và NULL.

Các cách tương đương

-- Cách 1: TRIM + COALESCE (bài viết)
WHERE COALESCE(TRIM(FirstName), '') = ''

-- Cách 2: CASE (rõ ràng)
WHERE CASE WHEN FirstName IS NULL THEN 1 WHEN TRIM(FirstName) = '' THEN 1 ELSE 0 END = 1

-- Cách 3: REGEXP (MySQL 8.0+)
WHERE FirstName REGEXP '^[[:space:]]*$' OR FirstName IS NULL

-- Cách 4: LENGTH(TRIM()) = 0
WHERE LENGTH(TRIM(COALESCE(FirstName, ''))) = 0

Lưu ý

  • TRIM() mặc định xóa space (0x20). Không xóa tab, newline → dùng TRIM(BOTH '\t' FROM ...) nếu cần.
  • Index không dùng được cho TRIM(col) = ''. Cần generated column clean_name = TRIM(FirstName) + index nếu truy vấn thường xuyên.
  • Thiết kế tốt: CHECK (TRIM(FirstName) != '') (MySQL 8.0.16+) hoặc trigger ngăn chặn insert whitespace-only.