Regex MySQL: Khớp mẫu có phần số tùy chọn ở cuối
Sử dụng REGEXP với pattern cho phép nhóm số tùy chọn (([^0-9]|$)) sau tiền tố cố định để lọc bản ghi.
Ví dụ minh họa
Tạo bảng DemoTable:
mysql> CREATE TABLE DemoTable (EmployeeCode VARCHAR(100)); Query OK, 0 rows affected (0.56 sec)
Chèn dữ liệu (có bản ghi có số phụ sau mã nhân viên):
mysql> INSERT INTO DemoTable VALUES('EMPLOYEE:100 John Smith');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO DemoTable VALUES('EMPLOYEE:16537 Chris Brown');
Query OK, 1 row affected (0.10 sec)
mysql> INSERT INTO DemoTable VALUES('EMPLOYEE:100 David Miller');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DemoTable VALUES('EMPLOYEE:100 23432 David Miller');
Query OK, 1 row affected (0.20 sec)
Xem dữ liệu:
mysql> SELECT * FROM DemoTable;
+---------------------------------+ | EmployeeCode | +---------------------------------+ | EMPLOYEE:100 John Smith | | EMPLOYEE:16537 Chris Brown | | EMPLOYEE:100 David Miller | | EMPLOYEE:100 23432 David Miller | +---------------------------------+ 4 rows in set (0.00 sec)
Tìm bản ghi bắt đầu bằng "EMPLOYEE:100" theo sau là KHÔNG PHẢI SỐ (hoặc kết thúc chuỗi):
mysql> SELECT * FROM DemoTable WHERE EmployeeCode REGEXP "EMPLOYEE:100([^0-9]|$)";
Kết quả (loại bỏ dòng có "EMPLOYEE:100 23432..."):
+---------------------------------+ | EmployeeCode | +---------------------------------+ | EMPLOYEE:100 John Smith | | EMPLOYEE:100 David Miller | | EMPLOYEE:100 23432 David Miller | +---------------------------------+ 3 rows in set (0.00 sec)
Giải thích Pattern "EMPLOYEE:100([^0-9]|$)"
EMPLOYEE:100 # Chuỗi cố định bắt buộc ( # Nhóm bắt buộc (phải khớp 1 trong 2): [^0-9] # Ký tự KHÔNG phải số (0-9): khoảng trắng, chữ, dấu câu... | # HOẶC $ # Kết thúc chuỗi (end of string) ) # Kết thúc nhóm
Áp dụng lên dữ liệu:
EMPLOYEE:100 John Smith→ sau "100" là khoảng trắng[^0-9]→ KhớpEMPLOYEE:100 David Miller→ sau "100" là khoảng trắng → KhớpEMPLOYEE:100 23432 David Miller→ sau "100" là khoảng trắng[^0-9]→ Khớp (lưu ý: pattern chỉ kiểm tra ký tự TIẾP THEO, không phải toàn bộ số 23432)EMPLOYEE:16537 Chris Brown→ không bắt đầu bằng "EMPLOYEE:100" → Không khớp
⚠️ Sửa pattern để LOẠI BỎ "EMPLOYEE:100 23432..."
Nếu muốn chỉ giữ "EMPLOYEE:100" theo sau ngay lập tức là KHÔNG PHẢI SỐ (loại bỏ có số phụ):
-- Yêu cầu: sau "100" phải là non-digit HOẶC end-of-string WHERE EmployeeCode REGEXP '^EMPLOYEE:100([^0-9]|$)';
Pattern ^EMPLOYEE:100([^0-9]|$):
^: Bắt đầu chuỗiEMPLOYEE:100: Tiền tố cố định([^0-9]|$): Ký tự tiếp theo KHÔNG phải số HOẶC kết thúc chuỗi- Kết quả: Loại bỏ "EMPLOYEE:100 23432..." (vì sau "100" là space → khớp [^0-9] → vẫn giữ. Cần pattern phức tạp hơn để loại space+số)
Pattern chính xác hơn (loại bỏ space + số)
-- Sau "100" chỉ cho phép: space+chữ, space+end, hoặc end ngay WHERE EmployeeCode REGEXP '^EMPLOYEE:100( [A-Za-z]|$)';