Tình huống
Khi dữ liệu lưu dưới dạng chuỗi phân cách bằng dấu phẩy (CSV) trong một cột, cần tìm các dòng chứa giá trị cụ thể.
Giải pháp: FIND_IN_SET()
Hàm FIND_IN_SET(str, strlist) trả về vị trí của chuỗi str trong danh sách strlist (phân cách bằng dấu phẩy). Trả về 0 nếu không tìm thấy.
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
ListOfValues VARCHAR(200)
);
mysql> INSERT INTO DemoTable VALUES('112,114,567,Java,345');
mysql> INSERT INTO DemoTable VALUES('222,214,256');
mysql> INSERT INTO DemoTable VALUES('2,567,98,C');
Dữ liệu gốc
+----------------------+ | ListOfValues | +----------------------+ | 112,114,567,Java,345 | | 222,214,256 | | 2,567,98,C | +----------------------+
Truy vấn tìm dòng chứa giá trị '2'
mysql> SELECT * FROM DemoTable
-> WHERE FIND_IN_SET('2', ListOfValues) > 0;
Kết quả
+--------------+ | ListOfValues | +--------------+ | 2,567,98,C | +--------------+
Lưu ý quan trọng
- Không có dấu cách sau dấu phẩy:
'1,2,3'đúng,'1, 2, 3'sai - Phân biệt chữ hoa/thường:
FIND_IN_SET('java', 'Java')trả về 0 - Hiệu năng: Không sử dụng index, chậm trên bảng lớn
Thiết kế tốt hơn
Thay vì lưu CSV, hãy chuẩn hóa cơ sở dữ liệu:
CREATE TABLE Items (
Id INT PRIMARY KEY,
ListId INT,
Value VARCHAR(50),
FOREIGN KEY (ListId) REFERENCES Lists(Id)
);
Sau đó dùng JOIN thông thường - nhanh hơn, đúng chuẩn quan hệ.