Khi cột lưu trữ nhiều giá trị phân cách bằng dấu | (pipe-delimited), dùng biểu thức chính quy (REGEXP) để tìm chính xác một giá trị — tránh khớp nhầm chuỗi con (ví dụ: tìm "8" không khớp "18", "80", "98").
Ví dụ minh họa
Tạo bảng và chèn dữ liệu:
CREATE TABLE DemoTable (Value VARCHAR(60));
INSERT INTO DemoTable VALUES
('8|56|78|45'), ('9876'), ('98|8'), ('3|8|9'), ('97|94'), ('103|104|110|8|97');
Tìm các hàng chứa giá trị 8 độc lập (không phải một phần của số khác):
SELECT * FROM DemoTable WHERE Value REGEXP '\\|8\\|';
Kết quả
| Value |
|---|
| 3|8|9 |
| 103|104|110|8|97 |
Giải thích REGEXP '\\|8\\|'
\\|: Khớp ký tự pipe thực tế (cần escape vì|là ký tự đặc biệt trong regex = OR).8: Khớp chính xác số 8.\\|: Khớp pipe tiếp theo.
→ Chỉ khớp khi "8" nằm giữa hai dấu pipe: |8|.
Xử lý trường hợp đầu/cuối chuỗi
Regex trên bỏ sót giá trị ở đầu hoặc cuối chuỗi (ví dụ: 8|56 hoặc 56|8). Cách khỏe hơn:
WHERE Value REGEXP '(^|\\|)8(\\||$)'
(^|\\|): Bắt đầu chuỗi HOẶC pipe.8: Giá trị cần tìm.(\\||$): Pipe HOẶC cuối chuỗi.
Lưu ý thiết kế
Lưu trữ nhiều giá trị trong một cột (denormalized) vi phạm chuẩn 1NF. Nên tách thành bảng liên kết (junction table) nếu có thể. Chỉ dùng REGEXP khi không thể thay đổi schema.