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

ค้นหาสตริงในคอลัมน์ Comma-Separated Values ด้วย MySQL REGEXP

เมื่อเก็บข้อมูลหลายค่าในคอลัมน์เดียวแบบ 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) ซึ่งเร็วกว่า