Khi cần lọc các hàng mà cột chuỗi khớp với một mẫu phức tạp (ví dụ: tên sản phẩm bắt đầu bằng 'Product' theo sau là số 1-4, có thể có gạch ngang hoặc không), dùng toán tử REGEXP (biểu thức chính quy) trong MySQL.
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (
ProductId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ProductName VARCHAR(20)
);
mysql> INSERT INTO DemoTable (ProductName) VALUES
('Product-1'), ('Product2'), ('Product1'), ('Product-3'), ('Product3'), ('Product-4'), ('Product4');
Dữ liệu
mysql> SELECT * FROM DemoTable;
+-----------+-------------+
| ProductId | ProductName |
+-----------+-------------+
| 1 | Product-1 |
| 2 | Product2 |
| 3 | Product1 |
| 4 | Product-3 |
| 5 | Product3 |
| 6 | Product-4 |
| 7 | Product4 |
+-----------+-------------+
Truy vấn: Lọc ProductName khớp mẫu 'Product[1234]...' (số 1-4, có thể có gạch ngang)
mysql> SELECT * FROM DemoTable
WHERE ProductName REGEXP 'Product[1234].*';
Kết quả
+-----------+-------------+
| ProductId | ProductName |
+-----------+-------------+
| 2 | Product2 |
| 3 | Product1 |
| 5 | Product3 |
| 7 | Product4 |
+-----------+-------------+
Giải thích Regex
Product: Chuỗi cố định "Product".[1234]: Một ký tự trong tập {1,2,3,4}..*: Bất kỳ ký tự nào (kể cả rỗng) số lượng bất kỳ (greedy). Khớp cả '-1', '2', '-3', '4'...
Các hàng Product-1 (Id 1) và Product-4 (Id 6) không khớp vì mẫu [1234] yêu cầu ký tự ngay sau 'Product' phải là 1-4, nhưng thực tế là dấu gạch ngang '-'.
Sửa regex để khớp cả có gạch ngang
WHERE ProductName REGEXP 'Product-?[1234]'
-?: Dấu gạch ngang xuất hiện 0 hoặc 1 lần.- Kết quả sẽ bao gồm cả 'Product-1', 'Product1', 'Product-3', 'Product3', v.v.
Lưu ý
REGEXPkhông dùng index (full scan). Bảng lớn -> cân nhắc Fulltext Search hoặc xử lý ở ứng dụng.- MySQL 8.0 dùng thư viện regex ICU (hỗ trợ Unicode tốt hơn).
- Để không phân biệt chữ hoa/thường: mặc định không phân biệt (collation _ci). Muốn phân biệt:
REGEXP BINARY.