sql >> Base de Datos >  >> RDS >> Mysql

Alternativa a la cláusula LIKE en 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

de todos modos, es mejor que refactorice su esquema agregando una tabla de categorías y la referencia a ella en la tabla de productos (principal)

EDITAR

otra forma de enfrentar este problema es usando REGEXP lo que conducirá a un WHERE más corto cláusula (esto es lo que he usado para probar):

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;

esto coincidirá con su prod_catg contra la expresión regular '^1,.*|.*,1$|.*,1,.*' devolviendo 1 (TRUE) si coincide, 0 (FALSE) de lo contrario.

Entonces su cláusula WHERE se verá así:

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

explicación de la expresión regular:

^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

Estoy seguro de que esta expresión regular podría ser mucho más compacta, pero no soy tan bueno con las expresiones regulares

obviamente, puede cambiar la categoría que está buscando en la expresión regular (intente reemplazar 1 con 7 en el ejemplo anterior)