La réponse de Paul Dixon a brillamment fonctionné pour moi. Pour ajouter à cela, voici quelques choses que j'ai observées pour ceux qui souhaitent utiliser REGEXP:
Pour réaliser plusieurs filtres LIKE avec des caractères génériques:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field LIKE '%1940 %';
Utilisez l'alternative REGEXP:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 ';
Les valeurs entre guillemets REGEXP et entre les | Les opérateurs (OR) sont traités comme des caractères génériques. En règle générale, REGEXP nécessite des expressions génériques telles que (. *) 1740 (. *) Pour fonctionner en tant que% 1740%.
Si vous avez besoin de plus de contrôle sur le placement du caractère générique, utilisez certaines de ces variantes:
Pour réaliser COMME avec le placement contrôlé de caractères génériques:
SELECT * FROM fiberbox WHERE field LIKE '1740 %'
OR field LIKE '%1938 '
OR field LIKE '%1940 % test';
Utilisation:
SELECT * FROM fiberbox WHERE field REGEXP '^1740 |1938 $|1940 (.*) test';
Placer ^ devant la valeur indique le début de la ligne.
Placer $ après la valeur indique la fin de la ligne.
Le placement (. *) Se comporte un peu comme le caractère générique%.
Le . indique n'importe quel caractère, sauf les sauts de ligne. Placement. inside () avec * (. *) ajoute un motif répétitif indiquant n'importe quel nombre de caractères jusqu'à la fin de la ligne.
Il existe des moyens plus efficaces d'affiner des correspondances spécifiques, mais cela nécessite un examen plus approfondi des expressions régulières. REMARQUE: tous les modèles d'expression régulière ne semblent pas fonctionner dans les instructions MySQL. Vous devrez tester vos modèles et voir ce qui fonctionne.
Enfin, pour réaliser plusieurs filtres LIKE et NOT LIKE:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field NOT LIKE '%1940 %'
OR field NOT LIKE 'test %'
OR field = '9999';
Utilisez l'alternative REGEXP:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |^9999$'
OR field NOT REGEXP '1940 |^test ';
OU Alternative mixte:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 '
OR field NOT REGEXP '1940 |^test '
OR field NOT LIKE 'test %'
OR field = '9999';
Remarquez que j'ai séparé l'ensemble NOT dans un filtre WHERE distinct. J'ai expérimenté l'utilisation de modèles de négation, de modèles prospectifs, etc. Cependant, ces expressions ne semblaient pas donner les résultats souhaités. Dans le premier exemple ci-dessus, j'utilise ^ 9999 $ pour indiquer la correspondance exacte. Cela vous permet d'ajouter des correspondances spécifiques avec des correspondances génériques dans la même expression. Cependant, vous pouvez également mélanger ces types d'instructions comme vous pouvez le voir dans le deuxième exemple répertorié.
En ce qui concerne les performances, j'ai effectué quelques tests mineurs sur une table existante et je n'ai trouvé aucune différence entre mes variations. Cependant, j'imagine que les performances pourraient être un problème avec des bases de données plus grandes, des champs plus grands, un plus grand nombre d'enregistrements et des filtres plus complexes.
Comme toujours, utilisez la logique ci-dessus car cela a du sens.
Si vous voulez en savoir plus sur les expressions régulières, je recommande www.regular-expressions.info comme bon site de référence.
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")