เมื่อเก็บข้อมูลหลายค่าในคอลัมน์เดียวแบบ Comma-Separated (CSV) เช่น 'MongoDB,Java,Python' สามารถค้นหาว่ามีคำเฉพาะอยู่ในรายการหรือไม่ได้โดยใช้ REGEXP ด้วย Pattern ที่จับคู่ขอบเขตคำ
ตัวอย่างการใช้งาน
1. สร้างตารางและเพิ่มข้อมูล
mysql> create table DemoTable1902 ( Subjects text ); Query OK, 0 rows affected (0.00 sec)
mysql> insert into DemoTable1902 values('MongoDB,Java,Python'); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1902 values('SQL Server,MySQL,PL/SQL'); Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1902 values('Hibernate,Spring,JPA'); Query OK, 1 row affected (0.00 sec)
ข้อมูลทั้งหมด:
mysql> select * from DemoTable1902;
+-------------------------+ | Subjects | +-------------------------+ | MongoDB,Java,Python | | SQL Server,MySQL,PL/SQL | | Hibernate,Spring,JPA | +-------------------------+ 3 rows in set (0.00 sec)
2. ค้นหาแถวที่มี 'MySQL' ในรายการ
mysql> select * from DemoTable1902 where Subjects regexp '(^|.*,)MySQL(,.*|$)';
ผลลัพธ์:
+-------------------------+ | Subjects | +-------------------------+ | SQL Server,MySQL,PL/SQL | +-------------------------+ 1 row in set (0.00 sec)
อธิบาย Regular Expression Pattern
(^|.*,)MySQL(,.*|$)
| ส่วน | ความหมาย |
|---|---|
(^|.*,) | เริ่มสตริง (^) หรือ คอมม่าก่อนหน้า (.*,) - รับประกันว่า "MySQL" อยู่ต้นหรือหลังคอมม่า |
MySQL | คำที่ต้องการค้นหา (Case-insensitive โดยค่าเริ่มต้น) |
(,.*|$) | คอมม่าหลัง (,.*) หรือ จบสตริง ($) - รับประกันว่า "MySQL" จบหรือก่อนคอมม่า |
ทำไมไม่ใช้ LIKE '%MySQL%'?
-- LIKE '%MySQL%' จะจับ 'MySQLite' หรือ 'NoMySQL' ด้วย (False Positive) -- REGEXP '(^|.*,)MySQL(,.*|$)' จับเฉพาะคำเต็มในรายการ CSV
ฟังก์ชัน FIND_IN_SET (MySQL Built-in)
MySQL มีฟังก์ชันเฉพาะสำหรับ CSV:
SELECT * FROM DemoTable1902 WHERE FIND_IN_SET('MySQL', Subjects) > 0;
- เร็วกว่า REGEXP สำหรับ CSV แบบง่าย
- ไม่รองรับช่องว่างรอบคอมม่า (ต้องเป็น 'a,b,c' ไม่ใช่ 'a, b, c')
- Case-insensitive
สรุป: ใช้ REGEXP '(^|.*,)value(,.*|$)' เพื่อค้นหาคำใน CSV อย่างแม่นยำ หรือ FIND_IN_SET('value', csv_col) สำหรับ CSV มาตรฐาน (ไม่มี space) ซึ่งเร็วกว่า