Mi consulta actual se ve así:
SELECT * FROM fiberbox f WHERE f.fiberBox LIKE '%1740 %' OR f.fiberBox LIKE '%1938 %' OR f.fiberBox LIKE '%1940 %'
Miré un poco y no encuentro nada similar a LIKE IN (). Imagino que funcione así:
SELECT * FROM fiberbox f WHERE f.fiberbox LIKE IN('%140 %', '%1938 %', '%1940 %')
¿Algunas ideas? ¿Estoy pensando en el problema de la manera incorrecta? Algún comando oscuro que nunca he visto.
MySQL 5.0.77-registro-comunidad
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")
%
Respuestas:
Un REGEXP podría ser más eficiente, pero tendría que compararlo para asegurarse, por ejemplo
fuente
REGEXP
era prohibitivamente lento, pero necesitaba la flexibilidad de REGEXP para reducir mi conjunto de resultados más de lo queLIKE
podía proporcionar. Se me ocurrió una solución híbrida donde usé ambosLIKE
yREGEXP
; a pesar de que laREGEXP
porción es suficiente para darme los resultados correctos, usarLIKE
MySQL también permitió reducir considerablemente el conjunto de resultados antes de tener que usar losREGEXP
criterios más lentos .(select group_concat(myColumn separator '|') from..)
La respuesta de Paul Dixon funcionó brillantemente para mí. Para agregar a esto, aquí hay algunas cosas que observé para aquellos interesados en usar REGEXP:
Para lograr múltiples filtros LIKE con comodines:
Utilice la alternativa REGEXP:
Valores dentro de comillas REGEXP y entre | El operador (OR) se trata como comodines. Normalmente, REGEXP requerirá expresiones comodín como (. *) 1740 (. *) Para funcionar como% 1740%.
Si necesita más control sobre la ubicación del comodín, use algunas de estas variantes:
Para lograr LIKE con la colocación de comodines controlados:
Utilizar:
Colocar ^ delante del valor indica el inicio de la línea.
Colocar $ después del valor indica el final de la línea.
Colocar (. *) Se comporta como el comodín%.
Los . indica cualquier carácter individual, excepto los saltos de línea. Colocación inside () con * (. *) agrega un patrón repetitivo que indica cualquier número de caracteres hasta el final de la línea.
Hay formas más eficientes de reducir coincidencias específicas, pero eso requiere una mayor revisión de las expresiones regulares. NOTA: No todos los patrones de expresiones regulares parecen funcionar en las declaraciones de MySQL. Tendrá que probar sus patrones y ver qué funciona.
Finalmente, para lograr múltiples filtros LIKE y NOT LIKE:
Utilice la alternativa REGEXP:
O Alternativa Mixta:
Observe que separé el conjunto NO en un filtro WHERE separado. Experimenté con el uso de patrones de negación, patrones prospectivos, etc. Sin embargo, estas expresiones no parecían producir los resultados deseados. En el primer ejemplo anterior, uso ^ 9999 $ para indicar la coincidencia exacta. Esto le permite agregar coincidencias específicas con coincidencias comodín en la misma expresión. Sin embargo, también puede mezclar este tipo de declaraciones como puede ver en el segundo ejemplo que se enumera.
Con respecto al rendimiento, realicé algunas pruebas menores en una tabla existente y no encontré diferencias entre mis variaciones. Sin embargo, imagino que el rendimiento podría ser un problema con bases de datos más grandes, campos más grandes, mayores recuentos de registros y filtros más complejos.
Como siempre, use la lógica anterior, ya que tiene sentido.
Si desea obtener más información sobre las expresiones regulares, le recomiendo www.regular-expressions.info como un buen sitio de referencia.
fuente
WHERE IFNULL(field, '') NOT REGEXP '1740 | 1938'
Puede crear una vista en línea o una tabla temporal, llenarla con sus valores y emitir esto:
Sin embargo, esto puede devolverle varias filas para
fiberbox
algo similar'1740, 1938'
, por lo que esta consulta puede adaptarse mejor a usted:fuente
Regexp forma con lista de valores
fuente
Lo sentimos, no hay una operación similar a
LIKE IN
mysql.Si desea utilizar el operador LIKE sin una unión, deberá hacerlo de esta manera:
Sabes, MySQL no optimizará esa consulta, para tu información.
fuente
Solo tenga en cuenta que cualquiera que intente el REGEXP para usar la funcionalidad "LIKE IN"
IN le permite hacer:
En REGEXP esto no funcionará
Tiene que estar en una línea como esta:
fuente
Voltear operandos
fuente
create table x(en enum('a,b,c')));insert into x values('a'),('b')
en es solo aob haciendo este método volteando oprandsselect * from, x where 'a,c' like concat('%',en,'%')
puede ser más seguro en SQL Injunction sin necesidad de escapar de personajes como $ ^ etc.field
solo puede ser exactamentea
,b
oc
deberías usarlofield IN ('a', 'b', 'c')
. Pero en casos generales, esto NUNCA puede reemplazarfield LIKE '%a%' OR field LIKE '%b%' OR ...
porque el campo en sí puede ser algo así como lomagic
que sería'magic' LIKE '%a%'
verdadero, pero la expresión sería'a,b,c' LIKE '%magic%'
falsa.Esto sería correcto:
fuente
Solo un pequeño consejo:
Prefiero usar la variante RLIKE (exactamente el mismo comando que REGEXP ) ya que suena más como lenguaje natural y es más corta; bueno, solo 1 char.
El prefijo "R" es para Reg. Exp., Por supuesto.
fuente
Puede obtener el resultado deseado con la ayuda de Expresiones regulares .
Podemos probar la consulta anterior, haga clic en violín de SQL
Podemos probar la consulta anterior, haga clic en violín de SQL
fuente
[...]
es un conjunto de caracteres , lo que significa que cualquiera de los caracteres en el conjunto es suficiente para ser visto como una coincidencia. Así que cualquier valor con los dígitos '0
,1
,3
,4
,7
,8
,9
o el|
carácter de canalización coincidirá con esto.