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

ค้นหาสตริงขึ้นต้นด้วยตัวเลขใน MySQL ด้วย REGEXP

เมื่อต้องการค้นหาข้อมูลที่ขึ้นต้นด้วยตัวเลข (0-9) ให้ใช้ Regular Expression ด้วย Operator REGEXP และ Pattern '^[0-9]'

สร้างตารางและข้อมูล

mysql> create table DemoTable (Id varchar(200));
mysql> insert into DemoTable values('123User'),('_$123User'),('User123456'),('0000User'),('&^*User');

ข้อมูลในตาราง

+------------+
| Id         |
+------------+
| 123User    |
| _$123User  |
| User123456 |
| 0000User   |
| &^*User    |
+------------+

คำสั่ง REGEXP หาขึ้นต้นตัวเลข

mysql> SELECT DISTINCT Id FROM DemoTable WHERE Id REGEXP '^[0-9]';

ผลลัพธ์

+----------+
| Id       |
+----------+
| 123User  |
| 0000User |
+----------+

Pattern อธิบาย

  • ^ - จุดเริ่มต้นของสตริง (Anchor)
  • [0-9] - Character Class ตัวเลข 0-9
  • ^[0-9] - ขึ้นต้นด้วยตัวเลข

Pattern เพิ่มเติมที่ใช้บ่อย

PatternความหมายMatch Example
^[0-9]ขึ้นต้นตัวเลข1abc, 9xyz
^[A-Za-z]ขึ้นต้นตัวอักษรabc, Xyz
^[^0-9]ขึ้นต้นไม่ใช่ตัวเลขabc, _user
^[0-9]+$เป็นตัวเลขทั้งหมด123, 0
^[0-9]{3}ขึ้นต้น 3 ตัวเลข123abc, 999xyz
^[\u0E00-\u0E7F]ขึ้นต้นอักษรไทย (Unicode Range)สวัสดี, ไทย

REGEXP vs LIKE

  • LIKE - เร็วกว่า, ใช้ Index ได้ (Prefix), รองรับ % และ _ เท่านั้น
  • REGEXP - ยืดหยุ่นกว่า, ไม่ใช้ Index (Full Scan), รองรับ Regex เต็มรูปแบบ
  • MySQL 8.0 ใช้ ICU Regex Engine (เร็วกว่า, รองรับ Unicode ดีกว่า)

Performance Tip

-- หากค้นหาบ่อย ให้สร้าง Generated Column + Index
ALTER TABLE DemoTable 
ADD COLUMN starts_with_digit BOOLEAN 
GENERATED ALWAYS AS (Id REGEXP '^[0-9]') STORED,
ADD INDEX idx_starts_digit (starts_with_digit);

-- Query เร็วขึ้น
SELECT * FROM DemoTable WHERE starts_with_digit = TRUE;