Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Thay thế cho mệnh đề LIKE trong Mysql

prod_catg LIKE '1,%' --matches when 1 is the first category
OR prod_catg LIKE '%,1,%' --matches when 1 is somewhere in the middle
OR prod_catg LIKE '%,1' --matches 1 when is the last category

Dù sao đi nữa, bạn nên cấu trúc lại giản đồ của mình bằng cách thêm một bảng danh mục và tham chiếu đến nó trên bảng sản phẩm (chính)

CHỈNH SỬA

một cách khác để đối mặt với sự cố này là sử dụng REGEXP điều này sẽ dẫn đến WHERE ngắn hơn mệnh đề (đây là những gì tôi đã sử dụng để kiểm tra):

DECLARE @regexp VARCHAR(100);
SET @regexp = '^1,.*|.*,1$|.*,1,.*';

SELECT
    '1,11,15,51,22,31' REGEXP @regexp AS test1,
    '51,11,15,1,22,31' REGEXP @regexp AS test2,
    '11,15,51,22,31,1' REGEXP @regexp AS test3,
    '7,11,15,51,22,31' REGEXP @regexp AS test4,
    '51,11,15,7,22,31' REGEXP @regexp AS test5,
    '11,15,51,22,31,7' REGEXP @regexp AS test6;

điều này sẽ khớp với prod_catg của bạn chống lại Biểu thức chính quy '^1,.*|.*,1$|.*,1,.*' returnnig 1 (TRUE) nếu nó khớp, 0 (FALSE) ngược lại.

Sau đó, mệnh đề WHERE của bạn sẽ giống như sau:

WHERE prod_catg REGEXP '^1,.*|.*,1$|.*,1,.*'

giải thích về regexp:

^1,.* --matches 1 at the beginning of a string followed by a `,` and any other char
.*,1$ --matches 1 at the end of a string preceded by a `,` and any other char
.*,1,.* --matches 1 between two `,` which are sourrounded by any other chars
| --is the OR operator

Tôi chắc rằng regexp này có thể nhỏ gọn hơn nhiều nhưng tôi không giỏi lắm với các biểu thức chính quy

chắc chắn bạn có thể thay đổi danh mục bạn đang tìm kiếm trong biểu thức chính quy (thử thay thế 1 với 7 trong ví dụ trên)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cải thiện hiệu suất của mysql TẢI DỮ LIỆU / mysqlimport?

  2. Đang cố gắng thực hiện thao tác MINUS trong MySQL

  3. Độ dài cột JSON tối đa trong MySQL

  4. Trích xuất tên tệp từ một đường dẫn MYSQL

  5. Xóa các bản ghi cũ hơn một tháng / 30 ngày