Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tìm kiếm sản phẩm theo mẫu tên (REGEXP) trong MySQL

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 ý

  • REGEXP khô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.