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 similaire à un LIKE IN () - je l'imagine fonctionner comme ceci:
SELECT * FROM fiberbox f WHERE f.fiberbox LIKE IN('%140 %', '%1938 %', '%1940 %')
Des idées? Suis-je en train de penser au problème dans le mauvais sens - une commande obscure que je n'ai jamais vue.
Journal de communauté MySQL 5.0.77
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")
%
Réponses:
Un REGEXP pourrait être plus efficace, mais il faudrait le comparer pour être sûr, par exemple
la source
REGEXP
c'était excessivement lent, mais j'avais besoin de la flexibilité de REGEXP pour affiner mon jeu de résultats plus que ce queLIKE
je pouvais fournir. J'ai trouvé une solution hybride où j'ai utilisé les deuxLIKE
etREGEXP
; bien que laREGEXP
portion soit suffisante pour me donner les résultats corrects, l'utilisationLIKE
de MySQL a également permis de réduire considérablement l'ensemble de résultats avant d'avoir à utiliser lesREGEXP
critères plus lents .(select group_concat(myColumn separator '|') from..)
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:
Utilisez l'alternative REGEXP:
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:
Utilisation:
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:
Utilisez l'alternative REGEXP:
OU Alternative mixte:
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.
la source
WHERE IFNULL(field, '') NOT REGEXP '1740 | 1938'
Vous pouvez créer une vue en ligne ou une table temporaire, la remplir avec vos valeurs et émettre ceci:
Cependant, cela peut vous renvoyer plusieurs lignes pour un
fiberbox
qui ressemble à quelque chose'1740, 1938'
, donc cette requête peut mieux vous convenir:la source
Manière d'expression rationnelle avec liste de valeurs
la source
Désolé, il n'y a aucune opération similaire à
LIKE IN
dans mysql.Si vous souhaitez utiliser l'opérateur LIKE sans jointure, vous devrez le faire de cette façon:
Vous savez, MySQL n'optimisera pas cette requête, pour info.
la source
Notez simplement à quiconque essaie le REGEXP d'utiliser la fonctionnalité "LIKE IN".
IN vous permet de faire:
Dans REGEXP, cela ne fonctionnera pas
Il doit être sur une ligne comme celle-ci:
la source
Retourner les opérandes
la source
create table x(en enum('a,b,c')));insert into x values('a'),('b')
en est seulement a ou b faire cette méthode en retournant les commandesselect * from, x where 'a,c' like concat('%',en,'%')
peut être plus sûr dans SQL Injunction pas besoin d'échapper à des caractères comme $ ^ etc.field
ne pouvait être qu'exactementa
,b
ouc
alors vous devriez utiliserfield IN ('a', 'b', 'c')
. Mais dans les cas généraux, cela ne peut JAMAIS remplacerfield LIKE '%a%' OR field LIKE '%b%' OR ...
car le champ lui-même peut être quelque chose commemagic
ce qui rendrait'magic' LIKE '%a%'
vrai mais l'expression est'a,b,c' LIKE '%magic%'
fausse.Ce serait correct:
la source
Juste un petit conseil:
Je préfère utiliser la variante RLIKE (exactement la même commande que REGEXP ) car elle ressemble plus à du langage naturel et est plus courte; eh bien, juste 1 caractère.
Le préfixe "R" est pour Reg. Exp., Bien sûr.
la source
Vous pouvez obtenir le résultat souhaité à l'aide d' expressions régulières .
Nous pouvons tester la requête ci-dessus, veuillez cliquer sur SQL fiddle
Nous pouvons tester la requête ci-dessus, veuillez cliquer sur SQL fiddle
la source
[...]
est un jeu de caractères , ce qui signifie que l'un des caractères du jeu suffit pour être considéré comme une correspondance. Ainsi , toute valeur avec les chiffres »0
,1
,3
,4
,7
,8
,9
ou le|
caractère pipe correspondra à ce sujet .