Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

หาตำแหน่งค่าในคอลัมน์คั่นจุลภาคด้วย FIND_IN_SET ใน MySQL

การเตรียมข้อมูล

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;