Giải pháp: LIKE kết hợp NOT LIKE
Kiểm tra có chứa '--' nhưng không chứa '---'.
Ví dụ minh họa
Tạo bảng mật khẩu
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Password VARCHAR(100)
);
mysql> INSERT INTO DemoTable(Password) VALUES('John@--123');
mysql> INSERT INTO DemoTable(Password) VALUES('---Carol234');
mysql> INSERT INTO DemoTable(Password) VALUES('--David987');
mysql> INSERT INTO DemoTable(Password) VALUES('Mike----53443');
Dữ liệu gốc
+----+---------------+ | Id | Password | +----+---------------+ | 1 | John@--123 | | 2 | ---Carol234 | | 3 | --David987 | | 4 | Mike----53443 | +----+---------------+
Truy vấn: Chứa đúng 2 dấu '-' liên tiếp
mysql> SELECT * FROM DemoTable
-> WHERE Password LIKE '%--%'
-> AND Password NOT LIKE '%---%';
Kết quả
+----+------------+ | Id | Password | +----+------------+ | 1 | John@--123 | | 3 | --David987 | +----+------------+
Giải thích
LIKE '%--%': Có chuỗi '--' bất kỳ vị tríNOT LIKE '%---%': Loại trừ có '---' (3 dấu trở lên)- Kết hợp: Chỉ giữ lại có đúng 2 dấu liên tiếp
Cách chính xác hơn: REGEXP
-- Chứa -- nhưng không phải một phần của --- WHERE Password REGEXP '(^|[^-])--([^-]|$)' -- Hoặc negative lookahead (MySQL 8.0+ không hỗ trợ lookahead) -- Workaround: WHERE Password REGEXP '--' AND Password NOT REGEXP '---'
Đếm số dấu gạch ngang
SELECT Password,
(CHAR_LENGTH(Password) - CHAR_LENGTH(REPLACE(Password, '-', ''))) AS dash_count
FROM DemoTable;
Kết quả
+---------------+------------+ | Password | dash_count | +---------------+------------+ | John@--123 | 2 | | ---Carol234 | 3 | | --David987 | 2 | | Mike----53443 | 6 | +---------------+------------+
Ứng dụng: Validate format
-- Format: XX-XX-XX (2-2-2) WHERE Password REGEXP '^[^-]*-[^-]*-[^-]*$' AND Password NOT LIKE '%--%';