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

การค้นหาข้อมูลในคอลัมน์ CSV ด้วย REGEXP ใน MySQL

เมื่อต้องการค้นหาระเบียนที่มีค่าเฉพาะในคอลัมน์ที่เก็บค่าหลายค่าคั่นด้วยจุลภาค (CSV) การใช้ REGEXP (Regular Expression) จะแม่นยำกว่า LIKE เพราะสามารถระบุขอบเขตค่าได้ชัดเจน (ไม่จับค่าที่เป็นส่วนของค่าอื่น เช่น 90 ใน 190)

ตัวอย่างการใช้งาน

สร้างตารางและเพิ่มข้อมูล CSV:

mysql> CREATE TABLE DemoTable1447 (Value VARCHAR(100));
mysql> INSERT INTO DemoTable1447 VALUES ('19,58,90,56');
mysql> INSERT INTO DemoTable1447 VALUES ('56,89,99,100');
mysql> INSERT INTO DemoTable1447 VALUES ('75,76,65,90');
mysql> INSERT INTO DemoTable1447 VALUES ('101,54,57,59');

ดูข้อมูล:

mysql> SELECT * FROM DemoTable1447;
+--------------+
| Value        |
+--------------+
| 19,58,90,56  |
| 56,89,99,100 |
| 75,76,65,90  |
| 101,54,57,59 |
+--------------+

ค้นหาแถวที่มีค่า 90 อย่างแม่นยำ (ไม่จับ 190, 900, ฯลฯ):

mysql> SELECT * FROM DemoTable1447 
    -> WHERE Value REGEXP '(^|,)90($|,)';

ผลลัพธ์ (เจอแถวที่ 1 และ 3):

+-------------+
| Value       |
+-------------+
| 19,58,90,56 |
| 75,76,65,90 |
+-------------+

คำอธิบาย Regular Expression

(^|,)90($|,)
ส่วนความหมาย
(^|,)เริ่มต้นสตริง (^) หรือ จุลภาค (,) - ขอบเขตซ้าย
90ค่าที่ต้องการค้นหา
($|,)สิ้นสุดสตริง ($) หรือ จุลภาค (,) - ขอบเขตขวา

เปรียบเทียบกับ LIKE

คำสั่งผลลัพธ์สำหรับค่า '90'ปัญหา
LIKE '%90%'จับ 90, 190, 900, 901, 1990False Positive
LIKE '%,90,%' OR ...ซับซ้อน ต้องเช็ค 4 กรณี (นำหน้า, ท้าย, กลาง, ค่าเดียว)โค้ดยาว
REGEXP '(^|,)90($|,)'จับเฉพาะ 90 ที่เป็นค่าเต็มแม่นยำ สั้น

ข้อจำกัดและแนวทางแก้ไข

  • Performance: REGEXP ไม่ใช้ Index ได้ → Full Table Scan
  • ช่องว่าง: หากข้อมูลเป็น '19, 58, 90, 56' (มี Space) ให้ใช้ REPLACE(Value, ', ', ',') ก่อน หรือปรับ Regex
  • Best Practice: Normalize ข้อมูล (สร้างตารางแยก) หรือใช้ JSON Data Type