Pattern Matching: หาสตริงที่มีตัวอักษร 'a' อย่างน้อย 3 ตัวด้วย LIKE
ใช้ LIKE '%a%a%a%' — แต่ละ %a% หมายถึง "มี a อย่างน้อย 1 ตัวที่ตำแหน่งไหนก็ได้" รวม 3 ตัว = อย่างน้อย 3 ตัว 'a'
สร้างตารางและข้อมูล
mysql> create table DemoTable1393 (
-> CountryName varchar(40)
-> );
Query OK, 0 rows affected (0.71 sec)
mysql> insert into DemoTable1393 values('andorra');
mysql> insert into DemoTable1393 values('australia');
mysql> insert into DemoTable1393 values('argentina');
mysql> insert into DemoTable1393 values('austria');
ข้อมูลทั้งหมด
+-------------+ | CountryName | +-------------+ | andorra | | australia | | argentina | | austria | +-------------+
คำสั่ง LIKE '%a%a%a%'
mysql> select * from DemoTable1393 where CountryName like '%a%a%a%';
ผลลัพธ์
+-------------+ | CountryName | +-------------+ | australia | +-------------+
วิเคราะห์แต่ละชื่อ
| ชื่อ | จำนวน 'a' | ตรงเงื่อนไข? |
|---|---|---|
| andorra | 2 (a, a) | ไม่ |
| australia | 3 (a, a, a) | ใช่ |
| argentina | 3 (a, a, a) | ใช่ — แต่ผลลัพธ์ไม่แสดง? |
| austria | 2 (a, a) | ไม่ |
สังเกต: 'argentina' มี a 3 ตัว (a-r-g-e-n-t-i-n-a → ตำแหน่ง 1, 4, 9) แต่ผลลัพธ์ตัวอย่างแสดงเฉพาะ australia — อาจเป็นเพราะ collation case-insensitive และตัวอย่างข้อมูลอาจเป็น 'Argentina' (ตัวใหญ่) ทำให้ LIKE '%a%a%a%' (ตัวเล็ก) ไม่จับได้
แก้ไข: Case-insensitive search
WHERE LOWER(CountryName) LIKE '%a%a%a%'
-- หรือ
WHERE CountryName COLLATE utf8_general_ci LIKE '%a%a%a%'
วิธีที่ยืดหยุ่นกว่า: REGEXP
SELECT * FROM DemoTable1393 WHERE CountryName REGEXP 'a.*a.*a';
a.*a.*a = a ตามด้วยอะไรก็ได้ ตามด้วย a ตามด้วยอะไรก็ได้ ตามด้วย a
นับจำนวนตัวอักษรเฉพาะ (MySQL 8.0+)
SELECT CountryName,
(LENGTH(CountryName) - LENGTH(REPLACE(LOWER(CountryName), 'a', ''))) AS count_a
FROM DemoTable1393
HAVING count_a >= 3;
สรุป: LIKE '%a%a%a%' ทำงานได้สำหรับ case-sensitive collation สำหรับ case-insensitive ใช้ LOWER() หรือ REGEXP