ฟังก์ชัน REGEXP_INSTR() (MySQL 8.0+)
คืนตำแหน่งเริ่มต้นของ pattern ที่ match (1-based) หรือ 0 ถ้าไม่พบ — ใช้ใน WHERE ได้โดยตรง
ไวยากรณ์
REGEXP_INSTR(expr, pattern, position, occurrence, return_option, match_type)
- คืนค่า > 0 = พบ
- คืนค่า 0 = ไม่พบ
ตัวอย่าง: ตาราง demo64
CREATE TABLE demo64 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(40)
);
INSERT INTO demo64 (name) VALUES
('John Smith'), ('John Doe'), ('Chris Brown'),
('David Miller'), ('Carol Taylor');
คำสั่งค้นหา 'John'
SELECT * FROM demo64 WHERE REGEXP_INSTR(name, 'John');
ผลลัพธ์
+----+------------+ | id | name | +----+------------+ | 1 | John Smith | | 2 | John Doe | +----+------------+
เปรียบเทียบฟังก์ชันค้นหา
| ฟังก์ชัน | คืนค่า | ใช้ใน WHERE ได้ไหม | รองรับ Regex |
|---|---|---|---|
| LIKE | TRUE/FALSE | ✅ | ❌ (แค่ % _) |
| REGEXP | TRUE/FALSE | ✅ | ✅ |
| REGEXP_INSTR | Position (INT) | ✅ | ✅ |
| REGEXP_SUBSTR | Matched String | ✅ | ✅ |
| LOCATE() | Position (INT) | ✅ | ❌ (substring ธรรมดา) |
| INSTR() | Position (INT) | ✅ | ❌ |
ตัวอย่าง REGEXP_INSTR 進階
1. ค้นหาตำแหน่งที่ 2 ที่พบ
SELECT REGEXP_INSTR('abc def ghi', '[a-z]+', 1, 2); -- คืน 5 (ตำแหน่ง 'd')
2. คืนค่าตำแหน่งหลัง match (return_option = 1)
SELECT REGEXP_INSTR('abc123', '[0-9]+', 1, 1, 1); -- คืน 7 (หลัง '123')
3. Case-sensitive
SELECT REGEXP_INSTR('John', 'john', 1, 1, 0, 'c'); -- 0 (ไม่พบ)
SELECT REGEXP_INSTR('John', 'john', 1, 1, 0, 'i'); -- 1 (พบ, case-insensitive)
ประสิทธิภาพและข้อแนะนำ
- REGEXP_INSTR ไม่ใช้ INDEX → Full table scan
- สำหรับค้นหา简单: ใช้
LIKEหรือLOCATE()เร็วกว่า - สำหรับ Full-Text Search จริง: ใช้
FULLTEXT INDEX+MATCH() AGAINST() - MySQL < 8.0: ใช้
REGEXPแทน (คืน TRUE/FALSE)
ชนิดข้อมูลแนะนำสำหรับคอลัมน์ค้นหา
VARCHAR(255): ข้อความสั้น, ชื่อ, รหัสTEXT: ข้อความยาว, รายละเอียดJSON: ค้นหาใน JSON (MySQL 5.7+ มี JSON_EXTRACT, JSON_SEARCH)