2012-01-19 8 views
7

Tengo una consulta Necesito ejecutar en casi 2000 cadenas donde sería muy útil poder hacer una lista como se puede con el operador "IN" pero usando la operación de comparación LIKE.¿Cómo puedo usar el operador LIKE en una lista de cadenas para comparar?

Por ejemplo, yo quiero comprobar para ver si pet_name es como cualquiera de ellos (pero no exactamente): Barfy, máximo, bigotes, campeón, gran-D, Big D, Sally

Usando como que wouldn' t sea sensible a mayúsculas y también puede tener un guión bajo en lugar de un guión. O un espacio. Sería un gran dolor en el culo escribir una gran serie de operadores de quirófano. Estoy ejecutando esto en MySQL 5.1.

En mi caso particular, estoy buscando nombres de archivos donde las diferencias son generalmente un guion o un guion bajo, donde lo contrario sería.

+0

voy a decir que mientras yo estaba esperando que acabo de utilizar una cadena reemplazar la función en mi editor de texto en el lista de nombres de archivos separados por comas y agregada en el texto "O ME GUSTA" para cada uno. No tengo mucho tiempo para quemarme. – pthurmond

+0

Aunque elegí una ruta diferente seguiré viendo esta pregunta y elegiré un ganador. Varias personas realmente han pensado en el asunto y han proporcionado comentarios fantásticos que deberían ser recompensados. También he estado promoviendo respuestas que parecen buenas o al menos bien pensadas. – pthurmond

Respuesta

3

se podría hacer algo como esto -

SELECT FIND_IN_SET(
    'bigD', 
    REPLACE(REPLACE('barfy,max,whiskers,champ,big-D,Big D,Sally', '-', ''), ' ', '') 
) has_petname; 
+-------------+ 
| has_petname | 
+-------------+ 
|   5 | 
+-------------+ 

que dará un valor distinto de cero (> 0) si hay una pet_name que estamos buscando.

Pero me gustaría sugerir que le permite crear una tabla petnamesSOUNDS LIKE y utilizar la función de comparar nombres, en este caso 'BigD' será igual a 'BigD', por ejemplo:

SELECT 'bigD' SOUNDS LIKE 'big-D'; 
+---------------------------+ 
| 'bigD'SOUNDS LIKE 'big-D' | 
+---------------------------+ 
|       1 | 
+---------------------------+ 

Ejemplo:

CREATE TABLE petnames(name VARCHAR(40)); 
INSERT INTO petnames VALUES 
    ('barfy'),('max'),('whiskers'),('champ'),('big-D'),('Big D'),('Sally'); 

SELECT name FROM petnames WHERE 'bigD' SOUNDS LIKE name; 
+-------+ 
| name | 
+-------+ 
| big-D | 
| Big D | 
+-------+ 
+0

1 Haven' He oído hablar de sonidos como antes del – mkk

+0

+1 para el concepto interesante. Pero no creo que siga lo que estoy tratando de lograr (eso o simplemente no estoy siguiendo su implementación). Básicamente tengo archivos que tienen archivos hermanos a los que deben asociarse. Pero cuando el cliente generó muchos de estos archivos hermanos (varias personas lo hicieron) tuvieron algunos cambios de formato de forma automática o manual. Entonces "bobs-green-80-hat.eps" algunas veces se convirtió en "bobs-green_80-hat.eps.jpg" y otras veces se convirtió en "BOBS-GREEN-80-HAT.EPS.JPG", dependiendo de quién lo hizo. – pthurmond

+0

¿Almacena los nombres de archivo en la tabla? – Devart

1

Como primer paso ponga todos los valores estáticos en cualquier tabla temporal, este sería el diccionario de búsqueda.

SELECT * FROM Table t 
WHERE EXISTS (
      SELECT * 
      FROM LookupTable l 
      WHERE t.PetName LIKE '%' + l.Value + '%' 
      ) 
+0

Rigth, se perdió eso (se agregó ahora). Creo que el principal desafío para OP era procesar entradas múltiples, creo que él sabe cómo aplicar 'LIKE' pero de todos modos tenía razón – sll

+0

No estoy seguro de seguir con dos cuentas, primero cómo llegar a la tabla temporal (que puede mirar hacia arriba) y segundo cómo esta operación está funcionando. Específicamente, me parece que en la subconsulta está haciendo una comparación de un valor de la consulta de llamada directamente dentro de esa subconsulta. ¿Es eso posible? – pthurmond

+0

¿El OP necesitaría ingresar valores estáticos con un comodín (por ejemplo, big_d) para tener en cuenta diferentes valores (big-D, Big D, etc.) como el OP descrito? Además, LCASE() también es necesario? – JSuar

0

Configure la columna que contiene esos 2000 valores para la búsqueda de texto completo. Luego puede usar la función de búsqueda de texto completo de MySQL. Se refieren a su docs

8

Para esta tarea que sugeriría haciendo uso de RegExp capabilities in MySQL así:

select * from EMP where name RLIKE 'jo|ith|der'; 

Este es el caso partido insensible y salvará de múltiples como/o condiciones.

+0

¿Esta ignorar la diferencia entre un guión y un guión? – pthurmond

+0

Claro que se puede ejecutar esta consulta para obtener ese comportamiento: 'seleccionar * de EMP en reemplazar (nombre, '-', '_') 'jo | ITH | der' RLIKE;' – anubhava

+2

Este sumamente útil. Copie una lista de resultados de otra consulta, cambie cada salto de línea a una tubería, y esto funciona increíblemente bien. – spsaucier

0

En su lugar, puede usar REGEXP. Funcionó como un encanto para mí

expresión regular pet_name 'Barfy | max | bigotes | Champ | lo que sea'

Cuestiones relacionadas