Câu trả lời của Paul Dixon đã làm việc rất tốt cho tôi. Để thêm vào điều này, đây là một số điều tôi quan sát được đối với những người quan tâm đến việc sử dụng REGEXP:
Để hoàn thành nhiều bộ lọc THÍCH với Ký tự đại diện:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field LIKE '%1940 %';
Sử dụng REGEXP thay thế:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 ';
Giá trị trong dấu ngoặc kép REGEXP và giữa | Toán tử (OR) được coi là ký tự đại diện. Thông thường, REGEXP sẽ yêu cầu các biểu thức ký tự đại diện như (. *) 1740 (. *) Để hoạt động theo% 1740%.
Nếu bạn cần kiểm soát nhiều hơn đối với vị trí của ký tự đại diện, hãy sử dụng một số biến thể sau:
Để hoàn thành THÍCH với vị trí ký tự đại diện được kiểm soát:
SELECT * FROM fiberbox WHERE field LIKE '1740 %'
OR field LIKE '%1938 '
OR field LIKE '%1940 % test';
Sử dụng:
SELECT * FROM fiberbox WHERE field REGEXP '^1740 |1938 $|1940 (.*) test';
Đặt ^ trước giá trị cho biết bắt đầu của dòng.
Đặt $ sau giá trị chỉ ra cuối dòng.
Đặt (. *) Hoạt động giống như% ký tự đại diện.
Các . chỉ ra bất kỳ ký tự đơn nào, ngoại trừ ngắt dòng. Đặt. bên trong () với * (. *) thêm một mẫu lặp lại cho biết bất kỳ số lượng ký tự nào cho đến cuối dòng.
Có nhiều cách hiệu quả hơn để thu hẹp các kết quả khớp cụ thể, nhưng điều đó đòi hỏi phải xem xét lại nhiều hơn về Biểu thức chính quy. LƯU Ý: Không phải tất cả các mẫu regex dường như hoạt động trong các câu lệnh MySQL. Bạn sẽ cần phải kiểm tra các mẫu của bạn và xem những gì hoạt động.
Cuối cùng, Để Hoàn thành nhiều bộ lọc THÍCH và KHÔNG THÍCH:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field NOT LIKE '%1940 %'
OR field NOT LIKE 'test %'
OR field = '9999';
Sử dụng REGEXP thay thế:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |^9999$'
OR field NOT REGEXP '1940 |^test ';
HOẶC Thay thế hỗn hợp:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 '
OR field NOT REGEXP '1940 |^test '
OR field NOT LIKE 'test %'
OR field = '9999';
Lưu ý rằng tôi đã tách bộ KHÔNG trong bộ lọc WHERE riêng. Tôi đã thử nghiệm sử dụng các mẫu phủ định, các mẫu tìm về phía trước, v.v. Tuy nhiên, những biểu thức này đã không xuất hiện để mang lại kết quả mong muốn. Trong ví dụ đầu tiên ở trên, tôi sử dụng ^ 9999 $ để chỉ ra kết quả khớp chính xác. Điều này cho phép bạn thêm các kết quả khớp cụ thể với các kết hợp ký tự đại diện trong cùng một biểu thức. Tuy nhiên, bạn cũng có thể trộn các loại câu lệnh này như bạn có thể thấy trong ví dụ thứ hai được liệt kê.
Về hiệu suất, tôi đã chạy một số thử nghiệm nhỏ so với bảng hiện có và không tìm thấy sự khác biệt giữa các biến thể của tôi. Tuy nhiên, tôi tưởng tượng hiệu suất có thể là một vấn đề với cơ sở dữ liệu lớn hơn, các trường lớn hơn, số lượng bản ghi lớn hơn và các bộ lọc phức tạp hơn.
Như mọi khi, sử dụng logic ở trên vì nó có ý nghĩa.
Nếu bạn muốn tìm hiểu thêm về các biểu thức thông thường, tôi khuyên bạn nên sử dụng www. Thường-expressions.info như một trang web tham khảo tốt.
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")