functions - mysql workbench
Me gusta MySQL en()? (10)
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 %''
Hice algunas miradas a mi alrededor y no puedo encontrar nada similar a un LIKE IN (). Me lo imagino funcionando así:
SELECT * FROM fiberbox f WHERE f.fiberbox LIKE IN(''%140 %'', ''%1938 %'', ''%1940 %'')
¿Algunas ideas? ¿Estoy pensando en el problema de manera incorrecta? Algún comando oscuro que nunca he visto.
MySQL 5.0.77-community-log
Esto sería correcto:
SELECT * FROM table WHERE field regexp concat_ws("|",(
"111",
"222",
"333"
));
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:
SELECT * FROM fiberbox WHERE field LIKE ''%1740 %''
OR field LIKE ''%1938 %''
OR field LIKE ''%1940 %'';
Utilice la alternativa REGEXP:
SELECT * FROM fiberbox WHERE field REGEXP ''1740 |1938 |1940 '';
Valores dentro de las cotizaciones de REGEXP y entre las | (O) los operadores son tratados como comodines. Normalmente, REGEXP requerirá expresiones de 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 un LIKE con la colocación de comodines controlados:
SELECT * FROM fiberbox WHERE field LIKE ''1740 %''
OR field LIKE ''%1938 ''
OR field LIKE ''%1940 % test'';
Utilizar:
SELECT * FROM fiberbox WHERE field REGEXP ''^1740 |1938 $|1940 (.*) test'';
Colocar ^ delante del valor indica el inicio de la línea.
Colocar $ después del valor indica el final de la línea.
La colocación de (. *) Se comporta de forma muy parecida al% comodín.
Los . indica cualquier carácter individual, excepto saltos de línea. Colocando inside () con * (. *) agrega un patrón de repetición 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 más revisión de las expresiones regulares. NOTA: No todos los patrones de expresiones regulares parecen funcionar en las declaraciones de MySQL. Tendrás que probar tus patrones y ver qué funciona.
Finalmente, para lograr múltiples filtros LIKE y 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'';
Utilice la alternativa REGEXP:
SELECT * FROM fiberbox WHERE field REGEXP ''1740 |1938 |^9999$''
OR field NOT REGEXP ''1940 |^test '';
O Alternativa Mixta:
SELECT * FROM fiberbox WHERE field REGEXP ''1740 |1938 ''
OR field NOT REGEXP ''1940 |^test ''
OR field NOT LIKE ''test %''
OR field = ''9999'';
Observe que separé el conjunto NO en un filtro WHERE separado. Experimenté con el uso de patrones de negación, patrones de futuro, y así sucesivamente. Sin embargo, estas expresiones no parecieron dar los resultados deseados. En el primer ejemplo anterior, uso ^ 9999 $ para indicar una coincidencia exacta. Esto le permite agregar coincidencias específicas con coincidencias de comodín en la misma expresión. Sin embargo, también puede combinar estos tipos 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, usa la lógica anterior ya que tiene sentido.
Si desea obtener más información sobre las expresiones regulares, recomiendo www.regular-expressions.info como un buen sitio de referencia.
Lo sentimos, no hay ninguna operación similar a LIKE IN
en mysql.
Si desea utilizar el operador LIKE sin una unión, deberá hacerlo de esta manera:
(field LIKE value OR field LIKE value OR field LIKE value)
Ya sabes, MySQL no optimizará esa consulta, FYI.
Puede crear una vista en línea o una tabla temporal, rellenarla con sus valores y emitir esto:
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
Esto, sin embargo, puede devolverle varias filas para una fiberbox
que es algo así como ''1740, 1938''
, por lo que esta consulta puede ajustarse mejor:
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
)
Puede obtener el resultado deseado con la ayuda de expresiones regulares .
SELECT fiberbox from fiberbox where fiberbox REGEXP ''[1740|1938|1940]'';
Podemos probar la consulta anterior, por favor haga clic en el violín de SQL
SELECT fiberbox from fiberbox where fiberbox REGEXP ''[174019381940]'';
Podemos probar la consulta anterior, por favor haga clic en el violín de SQL
Regexp forma con lista de valores
SELECT * FROM table WHERE field regexp concat_ws("|",
"111",
"222",
"333");
Sólo un pequeño consejo:
Prefiero usar la variante RLIKE (exactamente el mismo comando que REGEXP ) ya que suena más como un lenguaje natural, y es más corto; Bueno, solo 1 char.
El prefijo "R" es para Reg. Exp., Por supuesto.
Solo tenga en cuenta que cualquiera que pruebe el REGEXP para usar la funcionalidad "LIKE IN".
IN te permite hacer:
field IN (
''val1'',
''val2'',
''val3''
)
En REGEXP esto no funcionará
REGEXP ''
val1$|
val2$|
val3$
''
Tiene que estar en una línea como esta:
REGEXP ''val1$|val2$|val3$''
Un REGEXP podría ser más eficiente, pero tendría que compararlo para estar seguro, por ejemplo,
SELECT * from fiberbox where field REGEXP ''1740|1938|1940'';
Voltear operandos
''a,b,c'' like ''%''||field||''%''