Khi cột lưu nhiều số phân cách bằng dấu phẩy (CSV), dùng LIKE với pattern %gia_tri% có thể tìm kiếm, nhưng dễ cho kết quả sai (false positive) do khớp chuỗi con.
Ví dụ minh họa
Tạo bảng và chèn dữ liệu:
CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
DoubleValue VARCHAR(20)
);
INSERT INTO DemoTable (DoubleValue) VALUES
('80.2,90.5,88.90'), ('78.56,45.80,88,45.6'), ('12.34,90.06,89.90');
Tìm chuỗi chứa "80":
SELECT * FROM DemoTable WHERE DoubleValue LIKE '%80%';
Kết quả (có false positive)
| Id | DoubleValue |
|---|---|
| 1 | 80.2,90.5,88.90 |
| 2 | 78.56,45.80,88,45.6 |
→ Hàng 2 khớp do chứa 45.80 và 88 (chứa "80" trong "45.80").
Cách chính xác hơn: REGEXP với ranh giới
MySQL 8.0+ hỗ trợ REGEXP với ranh biên từ [[:<:]] và [[:>:]] (word boundary):
SELECT * FROM DemoTable WHERE DoubleValue REGEXP '[[:<:]]80[[:>:]]';
Hoặc dùng pattern pipe-delimited (nếu dữ liệu chuẩn):
WHERE CONCAT(',', DoubleValue, ',') LIKE '%,80,%'
⚠️ Khuyến nghị thiết kế
Lưu trữ CSV trong một cột vi phạm chuẩn 1NF. Nên tách thành bảng con:
CREATE TABLE DemoTable_Values (
id INT AUTO_INCREMENT PRIMARY KEY,
parent_id INT,
value DECIMAL(10,2),
FOREIGN KEY (parent_id) REFERENCES DemoTable(Id)
);
Khi đó tìm kiếm chính xác, index hiệu quả, không lo false positive:
SELECT DISTINCT parent_id FROM DemoTable_Values WHERE value = 80;