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

MySQL ดึงข้อมูลที่ขึ้นต้นด้วยสระ 2 ตัวติดกัน (REGEXP)

ใช้ REGEXP / RLIKE สำหรับ Pattern Matching

MySQL รองรับ Regular Expression ผ่าน REGEXP (หรือ RLIKE alias) สำหรับ Pattern Matching ที่ซับซ้อนกว่า LIKE

ตัวอย่าง: เมืองที่ขึ้นต้นด้วยสระ 2 ตัวติดกัน

CREATE TABLE DemoTable664 (CityName VARCHAR(100));

INSERT INTO DemoTable664 VALUES
('Springfield'), ('Austin'), ('Franklin'), ('OAKLAND'), ('Anchorage');

Query: ใช้ REGEXP Pattern ^[aeiouAEIOU][aeiouAEIOU]

SELECT * FROM DemoTable664 
WHERE CityName RLIKE '^[aeiouAEIOU][aeiouAEIOU]';

ผลลัพธ์: Austin (Au), OAKLAND (OA)

+----------+
| CityName |
+----------+
| Austin   |
| OAKLAND  |
+----------+

อธิบาย Pattern

  • ^ - เริ่มต้นสตริง (Anchor)
  • [aeiouAEIOU] - Character Class: สระภาษาอังกฤษ (a,e,i,o,u) พิมพ์เล็กและใหญ่
  • [aeiouAEIOU] - สระอีกตัวหนึ่ง (ติดกัน 2 ตัว)

Regex Patterns ที่ใช้บ่อยใน MySQL

Patternความหมายตัวอย่าง Match
^abcขึ้นต้นด้วย abcabc, abcdef
abc$ลงท้ายด้วย abcabc, defabc
^abc$เท่ากับ abc ทุกตัวabc
[abc]ตัวอักษรใดตัวหนึ่ง a,b,ca, b, c
[^abc]ไม่ใช่ a,b,cd, e, 1
a.ba ตามด้วยตัวอะไรก็ได้ 1 ตัว แล้ว baXb, a1b, a b
a.*ba ตามด้วยอะไรก็ได้ 0+ ตัว แล้ว bab, aXb, aXYZb
[0-9]ตัวเลข 0-90, 5, 9
[a-zA-Z]ตัวอักษรภาษาอังกฤษa, Z, m

Case Sensitivity

  • MySQL 8.0+: REGEXP เป็น Case Insensitive โดย Default (ขึ้นกับ Collation)
  • บังคับ Case Sensitive: REGEXP BINARY หรือ Collate utf8mb4_bin
  • บังคับ Case Insensitive: REGEXP ธรรมดา หรือ Collate utf8mb4_general_ci

Performance Note

REGEXP ไม่ใช้ Index (Full Table Scan) - ใช้กับตารางเล็ก หรือรวมกับ WHERE อื่นที่มี Index ก่อน

ตัวอย่างเพิ่มเติม

-- โทรศัพท์ไทย: 08x-xxx-xxxx หรือ 09x-xxx-xxxx
WHERE phone REGEXP '^0[89][0-9]-?[0-9]{3}-?[0-9]{4}$'

-- Email 简单 validation
WHERE email REGEXP '^[^@]+@[^@]+\.[^@]+$'

-- มีตัวเลขอย่างน้อย 1 ตัว
WHERE password REGEXP '[0-9]'

-- เฉพาะตัวอักษรและตัวเลข (Alphanumeric)
WHERE code REGEXP '^[a-zA-Z0-9]+$'