การเตรียมข้อมูล
mysql> CREATE TABLE DemoTable1866 (
Value1 INT,
ListOfValues VARCHAR(100)
);
mysql> INSERT INTO DemoTable1866 VALUES(56, '78,56,98,95');
mysql> INSERT INTO DemoTable1866 VALUES(103, '103,90,102,104');
mysql> INSERT INTO DemoTable1866 VALUES(77, '34,45,77,78');
หาตำแหน่งของ Value1 ใน ListOfValues
mysql> SELECT Value1, ListOfValues,
FIND_IN_SET(Value1, ListOfValues) AS Output
FROM DemoTable1866;
ผลลัพธ์:
+--------+----------------+--------+
| Value1 | ListOfValues | Output |
+--------+----------------+--------+
| 56 | 78,56,98,95 | 2 |
| 103 | 103,90,102,104 | 1 |
| 77 | 34,45,77,78 | 3 |
+--------+----------------+--------+
การทำงานของ FIND_IN_SET
- คืนค่าตำแหน่ง (1-based index) ของ str ใน comma-separated string list
- คืนค่า 0 ถ้าไม่พบ
- คืนค่า NULL ถ้า argument ใด argument หนึ่งเป็น NULL
- ไม่รองรับช่องว่างรอบจุลภาค (ต้องเป็น 'a,b,c' ไม่ใช่ 'a, b, c')
ข้อจำกัดสำคัญ
- ไม่ใช้ Index ได้ - Full Table Scan เสมอ
- ทำงานช้าเมื่อข้อมูลเยอะ
- จุลภาคต้องไม่มี Space:
'a,b,c'OK,'a, b, c'ไม่ OK - ค่าที่มีจุลภาคในตัวเองจะแยกผิด
แนวทางแก้ไขข้อมูล (Normalization)
กรณีที่ยังต้องใช้ CSV
-- ทำความสะอาด Space ก่อน
SELECT FIND_IN_SET(Value1, REPLACE(ListOfValues, ' ', '')) FROM DemoTable1866;