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

MySQL REGEXP: แสดงเฉพาะเรคคอร์ดที่มีตัวอักษร หรือผสมตัวเลข-ตัวอักษร (ข้ามเฉพาะตัวเลข)

ไวยากรณ์ REGEXP

SELECT column FROM table
WHERE column REGEXP '[a-zA-Z]';

ตัวอย่าง: ตารางชื่อ

CREATE TABLE demo41 (name VARCHAR(40));

INSERT INTO demo41 VALUES
('John Smith34'), ('John Smith'), ('9234John Smith'),
('john smith'), ('98775');

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

+----------------+
| name           |
+----------------+
| John Smith34   |
| John Smith     |
| 9234John Smith |
| john smith     |
| 98775          |
+----------------+

คำสั่งกรอง: มีตัวอักษร A-Z หรือ a-z อย่างน้อย 1 ตัว

SELECT name FROM demo41
WHERE name REGEXP '[a-zA-Z]';

ผลลัพธ์: ข้าม '98775' (ตัวเลขอย่างเดียว)

+----------------+
| name           |
+----------------+
| John Smith34   |
| John Smith     |
| 9234John Smith |
| john smith     |
+----------------+

รูปแบบ REGEXP ที่ใช้บ่อย

รูปแบบความหมายตัวอย่าง match
[a-zA-Z]มีตัวอักษรอังกฤษอย่างน้อย 1 ตัว'A1', '1a', 'abc'
^[a-zA-Z]ขึ้นต้นด้วยตัวอักษร'John', 'A123'
[0-9]มีตัวเลขอย่างน้อย 1 ตัว'A1', '123'
^[0-9]+$เป็นตัวเลขอย่างเดียว (ทั้งสตริง)'123', '0'
[^a-zA-Z0-9]มีอักขระพิเศษ'A-B', '1@2'

กรณีศึกษา: ข้ามเฉพาะตัวเลขอย่างเดียว

-- วิธี 1: NOT REGEXP เฉพาะตัวเลข
SELECT * FROM demo41
WHERE name NOT REGEXP '^[0-9]+$';

-- วิธี 2: REGEXP มีตัวอักษร (เหมือนตัวอย่างหลัก)
SELECT * FROM demo41
WHERE name REGEXP '[a-zA-Z]';

หมายเหตุเกี่ยวกับ Collation

  • MySQL ใช้ collation ของคอลัมน์/ตารางในการเปรียบเทียบ
  • collation แบบ _ci (case-insensitive) จะจับ 'a' และ 'A' ได้เหมือนกัน
  • ถ้าต้องการ case-sensitive ใช้ REGEXP BINARY หรือ collation _cs/_bin

ประสิทธิภาพ

REGEXP ไม่ใช้ INDEX ได้ (full table scan) หากตารางใหญ่ ควรพิจารณา:

  • เพิ่มคอลัมน์ flag (เช่น has_letter BOOLEAN) และอัปเดตตอน INSERT/UPDATE
  • ใช้ Full-Text Search หากค้นหาข้อความจริง