MySQL COMO EN()?
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 a mi alrededor y no encontré nada similar a LIKE IN(). 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-registro comunitario
Un REGEXP podría ser más eficiente, pero habría que compararlo para estar seguro, por ejemplo
SELECT * from fiberbox where field REGEXP '1740|1938|1940';
La respuesta de Paul Dixon funcionó brillantemente para mí. Además de 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 cotizaciones REGEXP y entre | El operador (O) se trata como comodín. Normalmente, REGEXP requerirá expresiones comodín como (.*)1740 (.*) para funcionar como %1740 %.
Si necesita más control sobre la ubicación del comodín, utilice algunas de estas variantes:
Para lograr LIKE con colocación controlada de comodines:
SELECT * FROM fiberbox WHERE field LIKE '1740 %'
OR field LIKE '%1938 '
OR field LIKE '%1940 % test';
Usar:
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 (.*) se comporta de forma muy parecida al comodín %.
El . indica cualquier carácter, excepto saltos de línea. Colocación. dentro de () con * (.*) agrega un patrón repetido que indica cualquier número de caracteres hasta el final de la línea.
Hay formas más eficientes de limitar 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 declaraciones MySQL. Necesitará probar sus patrones y ver qué funciona.
Finalmente, para lograr múltiples filtros ME GUSTA y NO ME GUSTA:
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 NO configurado en un filtro WHERE separado. Experimenté con el uso de patrones de negación, patrones de visión de futuro, etc. Sin embargo, estas expresiones no parecieron dar los resultados deseados. En el primer ejemplo anterior, utilizo ^9999$ para indicar una coincidencia exacta. Esto le permite agregar coincidencias específicas con coincidencias comodín en la misma expresión. Sin embargo, también puedes mezclar este tipo de declaraciones como puedes ver en el segundo ejemplo listado.
En cuanto al rendimiento, realicé algunas pruebas menores con 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, utilice la lógica anterior si 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.
Manera de expresión regular con lista de valores.
SELECT * FROM table WHERE field regexp concat_ws("|",
"111",
"222",
"333");
Puede crear una vista en línea o una tabla temporal, completarla 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
Sin embargo, esto puede devolverle varias filas para algo fiberbox
así como '1740, 1938'
, por lo que esta consulta puede adaptarse mejor a sus necesidades:
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
)
Lo sentimos, no existe una operación similar a LIKE IN
la de mysql.
Si desea utilizar el operador LIKE sin unirse, deberá hacerlo de esta manera:
(field LIKE value OR field LIKE value OR field LIKE value)
Ya sabes, MySQL no optimizará esa consulta, para tu información.