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

MySQL: ค้นหาชื่อที่มีตัวอักษร 'a' อย่างน้อย 3 ตัวด้วย LIKE

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'ตรงเงื่อนไข?
andorra2 (a, a)ไม่
australia3 (a, a, a)ใช่
argentina3 (a, a, a)ใช่ — แต่ผลลัพธ์ไม่แสดง?
austria2 (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