Lọc chuỗi theo pattern số-dấu gạch ngang với REGEXP trong MySQL
Sử dụng toán tử REGEXP (Regular Expression) để tìm các chuỗi khớp với mẫu: chỉ chứa số và dấu gạch ngang (-), theo định dạng số điện thoại kiểu Mỹ: XXX-XXX-XXXX.
Ví dụ minh họa
Tạo bảng DemoTable:
mysql> CREATE TABLE DemoTable (Code VARCHAR(100)); Query OK, 0 rows affected (1.16 sec)
Chèn dữ liệu (có chuỗi hợp lệ và không hợp lệ):
mysql> INSERT INTO DemoTable VALUES('100-677-9876');
Query OK, 1 row affected (0.21 sec)
mysql> INSERT INTO DemoTable VALUES('100-677-9876-John');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO DemoTable VALUES('David-100-677-9876');
Query OK, 1 row affected (0.16 sec)
Xem dữ liệu:
mysql> SELECT * FROM DemoTable;
+--------------------+ | Code | +--------------------+ | 100-677-9876 | | 100-677-9876-John | | David-100-677-9876 | +--------------------+ 3 rows in set (0.00 sec)
Regex khớp chính xác định dạng XXX-XXX-XXXX:
mysql> SELECT * FROM DemoTable
WHERE Code REGEXP '^\\(?[0-9]{3}\\)?[\\s-]?[0-9]{3}[\\s-]?[0-9]{4}$';
Kết quả (chỉ dòng đầu khớp):
+--------------+ | Code | +--------------+ | 100-677-9876 | +--------------+ 1 row in set (0.00 sec)
Giải thích Regex pattern
^ # Bắt đầu chuỗi
\(? # Dấu '(' tùy chọn (cho định dạng (123) 456-7890)
[0-9]{3} # Đúng 3 chữ số
\)? # Dấu ')' tùy chọn
[\s-]? # Khoảng trắng HOẶC dấu gạch ngang (tùy chọn)
[0-9]{3} # Đúng 3 chữ số
[\s-]? # Khoảng trắng HOẶC dấu gạch ngang (tùy chọn)
[0-9]{4} # Đúng 4 chữ số
$ # Kết thúc chuỗi
Các pattern đơn giản hơn cho trường hợp này
| Yêu cầu | Pattern |
|---|---|
| Chỉ số và dấu -, đúng 12 ký tự (XXX-XXX-XXXX) | '^[0-9]{3}-[0-9]{3}-[0-9]{4}$' |
| Cho phép dấu cách thay cho - | '^[0-9]{3}[- ][0-9]{3}[- ][0-9]{4}$' |
| Chỉ chứa số và - (bất kỳ độ dài) | '^[0-9-]+$' |
| Bắt đầu bằng số, chỉ chứa số và - | '^[0-9][0-9-]*$' |
Lưu ý hiệu suất
REGEXPkhông sử dụng index thông thường → full table scan- Với bảng lớn: cân nhắc Generated Column + Index, hoặc xử lý ở application layer
- MySQL 8.0+: hỗ trợ
REGEXP_LIKE(),REGEXP_SUBSTR(),REGEXP_REPLACE()