MySQL COMO EN()?

Resuelto Michael Wales asked hace 15 años • 12 respuestas

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

Michael Wales avatar Jul 15 '09 01:07 Michael Wales
Aceptado

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'; 
Paul Dixon avatar Jul 14 '2009 18:07 Paul Dixon

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.

David Carroll avatar Jan 26 '2011 19:01 David Carroll

Manera de expresión regular con lista de valores.

SELECT * FROM table WHERE field regexp concat_ws("|",
"111",
"222",
"333");
user136379 avatar Jul 12 '2013 10:07 user136379

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 fiberboxasí 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
        )
Quassnoi avatar Jul 14 '2009 18:07 Quassnoi

Lo sentimos, no existe una operación similar a LIKE INla 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.

gahooa avatar Jul 14 '2009 18:07 gahooa