สถานการณ์: ค่าผสม "John500", "John6500" ต้องการที่ขึ้นต้นด้วย 5 หรือ 6
ไวยากรณ์ REGEXP
SELECT column FROM table
WHERE column REGEXP '^prefix[56]';
ตัวอย่าง: ตาราง demo45
CREATE TABLE demo45 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
value VARCHAR(50)
);
INSERT INTO demo45 (value) VALUES
('John500'), ('John1500'), ('John5500'), ('John6500'), ('John8600');
ข้อมูล
+----+----------+
| id | value |
+----+----------+
| 1 | John500 |
| 2 | John1500 |
| 3 | John5500 |
| 4 | John6500 |
| 5 | John8600 |
+----+----------+
คำสั่ง: ดึงที่ขึ้นต้นด้วย John ตามด้วย 5 หรือ 6
SELECT id, value FROM demo45
WHERE value REGEXP '^John[56]';
ผลลัพธ์ (id 1, 3, 4)
+----+----------+
| id | value |
+----+----------+
| 1 | John500 |
| 3 | John5500 |
| 4 | John6500 |
+----+----------+
อธิบาย Regex Pattern
| ส่วน | ความหมาย |
^ | เริ่มต้นสตริง (Anchor) |
John | ตัวอักษร "John" ตรงตัว |
[56] | Character class: ตัวเลข 5 หรือ 6 |
รูปแบบ Regex เพิ่มเติม
| Pattern | Match | ไม่ Match |
^John[56] | John500, John6500 | John1500, John8600 |
^John[56][0-9]* | John500, John6500, John5 | John5a, John6b |
^John(5|6)[0-9]* | เหมือนข้างบน (Group) | เหมือนข้างบน |
^John[0-9]{3}$ | John500, John999 | John50, John5000 |
^John[56].* | John5..., John6... | John1..., John7... |
Case Sensitivity
- Default: Case-insensitive (ขึ้นกับ collation _ci)
- Case-sensitive:
REGEXP BINARY '^John[56]' หรือ collation utf8mb4_bin
ประสิทธิภาพ
- REGEXP ไม่ใช้ INDEX → Full table scan
- ตารางใหญ่: เพิ่มคอลัมน์ prefix แยก (เช่น
prefix VARCHAR(10)) และ INDEX แทน
- MySQL 8.0: ใช้
REGEXP_LIKE() (synonym) ได้