Mysql
 sql >> Base de données >  >> RDS >> Mysql

Alternative à la clause LIKE dans 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 toute façon, vous feriez mieux de refactoriser votre schéma en ajoutant une table de catégorie et la référence à celle-ci sur la table (principale) du produit

MODIFIER

une autre façon de faire face à ce problème consiste à utiliser REGEXP ce qui conduira à un WHERE plus court clause (voici ce que j'ai utilisé pour tester):

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;

cela correspondra à votre prod_catg par rapport à l'expression régulière '^1,.*|.*,1$|.*,1,.*' renvoie 1 (TRUE) s'il correspond, 0 (FALSE) sinon.

Alors votre clause WHERE ressemblera à :

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

explication de 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

Je suis sûr que cette expression rationnelle pourrait être beaucoup plus compacte, mais je ne suis pas très bon avec les expressions régulières

évidemment, vous pouvez changer la catégorie que vous recherchez dans l'expression régulière (essayez de remplacer 1 avec 7 sur l'exemple ci-dessus)