การใช้ FIND_IN_SET() แทน REGEXP สำหรับ CSV Data
เมื่อคอลัมน์เก็บค่าหลายค่าคั่นด้วยคอมมา (CSV) ใช้ FIND_IN_SET(value, column) แทน REGEXP จะเร็วกว่าและแม่นยำกว่า
ไวยากรณ์
FIND_IN_SET(search_value, csv_column)
-- คืนค่า Position (1-based) หากเจอ, 0 หากไม่เจอ
ตัวอย่าง
CREATE TABLE demo17 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50),
value TEXT
);
INSERT INTO demo17 (first_name, value) VALUES
('John', '50'), ('David', ''), ('Adam', '50,89'), ('Adam', '49,89,43');
-- ค้นหาแถวที่มี '50' ใน value
SELECT * FROM demo17 WHERE FIND_IN_SET('50', value);
ผลลัพธ์
| id | first_name | value |
|---|---|---|
| 1 | John | 50 |
| 3 | Adam | 50,89 |
ข้อดีของ FIND_IN_SET:
- จัดการ CSV ได้ถูกต้อง (ไม่ match '50' ใน '150')
- เร็วกว่า REGEXP
- Syntax เรียบง่าย
ข้อจำกัด: ไม่ใช้ Index ได้ ควร Normalize ข้อมูลเป็นตารางแยก (Many-to-Many) สำหรับ Production