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

วิธีค้นหารูปแบบตัวเลขตามด้วยตัวอักษร (เช่น 99S, 50K) ใน MySQL ด้วย REGEXP

การค้นหารูปแบบข้อความด้วย Regular Expression (REGEXP) ใน MySQL

ใช้ REGEXP (หรือ RLIKE) เพื่อค้นหาข้อมูลที่ตรงตามรูปแบบ Regular Expression เช่น ตัวเลข 2 หลักตามด้วยตัวอักษรใหญ่ 1 ตัว

รูปแบบคำสั่ง

SELECT * FROM table_name WHERE column_name REGEXP 'pattern';

ตัวอย่าง: ค้นหา ID ที่เป็นตัวเลข 2 หลักตามด้วยตัวอักษร A-Z 1 ตัว

1. สร้างตารางและเพิ่มข้อมูล

CREATE TABLE DemoTable (Id VARCHAR(50));
INSERT INTO DemoTable VALUES ('John123'), ('123Chris'), ('99Bob'), ('19David'), ('99S'), ('10M');

2. ดูข้อมูลทั้งหมด

SELECT * FROM DemoTable;

ผลลัพธ์:

+----------+
| Id       |
+----------+
| John123  |
| 123Chris |
| 99Bob    |
| 19David  |
| 99S      |
| 10M      |
+----------+

3. ค้นหารูปแบบ: ^[0-9][0-9][A-Z]$ (ตัวเลข 2 หลัก + ตัวอักษรใหญ่ 1 ตัว)

SELECT * FROM DemoTable WHERE Id REGEXP '^[0-9][0-9][A-Z]$';

ผลลัพธ์:

+------+
| Id   |
+------+
| 99S  |
| 10M  |
+------+

อธิบาย Regular Expression Pattern

Regular Expression อื่นที่มีประโยชน์

Patternความหมาย
^จุดเริ่มต้นของสตริง
[0-9]ตัวเลข 0-9 (1 ตัว)
[0-9][0-9]ตัวเลข 2 ตัวติดกัน
[A-Z]ตัวอักษรใหญ่ A-Z (1 ตัว)
$จุดสิ้นสุดของสตริง
^[0-9][0-9][A-Z]$สตริงทั้งหมด = ตัวเลข 2 หลัก + ตัวอักษร 1 ตัว

MySQL REGEXP vs REGEXP_LIKE (MySQL 8.0+)

-- เก่า (ยังใช้ได้)
WHERE col REGEXP 'pattern'

-- ใหม่ (มาตรฐาน SQL)
WHERE REGEXP_LIKE(col, 'pattern')

ประสิทธิภาพ

  • REGEXP **ไม่ใช้ Index** ได้ (Full Table Scan)
  • ตารางใหญ่ ควรใช้ Generated Column + Index แทน
  • Pattern เรียบง่าย (เช่น ^prefix) MySQL บางเวอร์ชัน Optimize ให้ใช้ Index ได้

Generated Column สำหรับ REGEXP เร็ว

ALTER TABLE DemoTable 
ADD COLUMN IsPatternMatch TINYINT(1) 
GENERATED ALWAYS AS (Id REGEXP '^[0-9][0-9][A-Z]$') STORED,
ADD INDEX idx_pattern (IsPatternMatch);

SELECT * FROM DemoTable WHERE IsPatternMatch = 1;
Patternความหมายตัวอย่าง Match
^[0-9]+$เฉพาะตัวเลข (1 หลักขึ้นไป)'123', '0'
^[A-Za-z]+$เฉพาะตัวอักษร'abc', 'Hello'
^[0-9]{3}-[0-9]{4}$รูปแบบ โทรศัพท์ 3-4 หลัก'123-4567'
^(.+)@(.+)\.(.+)$Email แบบง่าย'a@b.com'
^[0-9]{2}[A-Z]{2}$ตัวเลข 2 + ตัวอักษร 2'99TH', '10UK'