MySQL LIKE IN ()?

Ma requête actuelle ressemble à ceci:

SELECT * FROM fiberbox f WHERE f.fiberBox LIKE '%1740 %' OR f.fiberBox LIKE '%1938 %' OR f.fiberBox LIKE '%1940 %' 

J’ai fait quelques recherches et je ne trouve rien de semblable à LIKE IN () – je pense que cela fonctionne comme ceci:

 SELECT * FROM fiberbox f WHERE f.fiberbox LIKE IN('%140 %', '%1938 %', '%1940 %') 

Des idées? Suis-je juste en train de penser au problème dans le mauvais sens – une commande obscure que je n’ai jamais vue.

MySQL 5.0.77-log-log

Un REGEXP pourrait être plus efficace, mais vous devrez le comparer pour être sûr, par exemple

 SELECT * from fiberbox where field REGEXP '1740|1938|1940'; 

La réponse de Paul Dixon a fonctionné avec brio pour moi. Pour append à cela, voici certaines choses que j’ai observées pour ceux qui sont intéressés par l’utilisation de REGEXP:

Pour effectuer 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 REGEXP Alternative:

  SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 '; 

Valeurs dans les guillemets REGEXP et entre les | Les opérateurs (OU) sont traités comme des caractères génériques. En règle générale, REGEXP requirejs des expressions génériques telles que (. *) 1740 (. *) Pour fonctionner avec% 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 de caractères génériques contrôlé:

 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.

  • Placer (. *) Se comporte comme le joker%.

  • Le . indique n’importe quel caractère, sauf les sauts de ligne. Mise en place. inside () with * (. *) ajoute un motif répétitif indiquant un nombre quelconque de caractères jusqu’à la fin de la ligne.

Il existe des moyens plus efficaces de réduire les correspondances spécifiques, mais cela nécessite un examen plus approfondi des expressions régulières. REMARQUE: tous les modèles regex 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 REGEXP Alternative:

 SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |^9999$' OR field NOT REGEXP '1940 |^test '; 

OU Mixte Alternative:

 SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 ' OR field NOT REGEXP '1940 |^test ' OR field NOT LIKE 'test %' OR field = '9999'; 

Notez que j’ai séparé le NOT dans un filtre WHERE séparé. J’ai expérimenté l’utilisation de motifs de négation, de patrons orientés vers l’avant, etc. Cependant, ces expressions ne semblaient pas donner les résultats escomptés. Dans le premier exemple ci-dessus, j’utilise ^ 9999 $ pour indiquer la correspondance exacte. Cela vous permet d’append 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 variantes. Cependant, j’imagine que la performance pourrait être un problème avec des bases de données plus grandes, des champs plus grands, un nombre d’enregistrements plus élevé et des filtres plus complexes.

Comme toujours, utilisez la logique ci-dessus car cela a du sens.

Si vous souhaitez en savoir plus sur les expressions régulières, je vous recommande le site http://www.regular-expressions.info comme un bon site de référence.

Vous pouvez créer une vue en ligne ou une table temporaire, remplissez-la avec vos valeurs et émettez-la:

 SELECT * FROM fiberbox f JOIN ( SELECT '%1740%' AS cond UNION ALL SELECT '%1938%' AS cond UNION ALL SELECT '%1940%' AS cond ) с ON f.fiberBox LIKE cond 

Ceci, cependant, peut vous renvoyer plusieurs lignes pour une fiberbox similaire à '1740, 1938' , donc cette requête peut vous convenir mieux:

 SELECT * FROM fiberbox f WHERE EXISTS ( SELECT 1 FROM ( SELECT '%1740%' AS cond UNION ALL SELECT '%1938%' AS cond UNION ALL SELECT '%1940%' AS cond ) с WHERE f.fiberbox LIKE cond ) 

Chemin Regexp avec liste de valeurs

 SELECT * FROM table WHERE field regexp concat_ws("|", "111", "222", "333"); 

Désolé, il n’y a pas d’opération similaire à LIKE IN dans mysql.

Si vous souhaitez utiliser l’opérateur LIKE sans jointure, vous devrez le faire de la manière suivante:

 (field LIKE value OR field LIKE value OR field LIKE value) 

Vous savez, MySQL n’optimisera pas cette requête, FYI.

Opérandes Flip

 'a,b,c' like '%'||field||'%' 

Juste un petit conseil:

Je préfère utiliser la variante RLIKE (exactement la même commande que REGEXP ) car elle ressemble plus au langage naturel et est plus courte; eh bien, juste 1 carat.

Le préfixe “R” est pour Reg. Exp., Bien sûr.

Notez simplement à toute personne essayant le REGEXP d’utiliser la fonctionnalité “LIKE IN”.

IN vous permet de faire:

 field IN ( 'val1', 'val2', 'val3' ) 

Dans REGEXP, cela ne fonctionnera pas

 REGEXP ' val1$| val2$| val3$ ' 

Il doit être dans une ligne comme celle-ci:

 REGEXP 'val1$|val2$|val3$' 

Ce serait correct:

 SELECT * FROM table WHERE field regexp concat_ws("|",( "111", "222", "333" )); 

Vous pouvez obtenir le résultat souhaité avec l’aide des expressions régulières .

 SELECT fiberbox from fiberbox where fiberbox REGEXP '[1740|1938|1940]'; 

Nous pouvons tester la requête ci-dessus s’il vous plaît cliquez sur SQL violon

 SELECT fiberbox from fiberbox where fiberbox REGEXP '[174019381940]'; 

Nous pouvons tester la requête ci-dessus s’il vous plaît cliquez sur SQL violon