เมื่อต้องการค้นหาระเบียนที่มีค่าเฉพาะในคอลัมน์ที่เก็บค่าหลายค่าคั่นด้วยจุลภาค (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, 1990 | False 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