2011-05-25 17 views
13

Debo usar este formato where A operand B. A es el campo; Quiero que B sea "texto 1" o "texto 2", por lo que si A tiene datos como "texto 1 texto textual" o "texto text 2", la consulta tendrá resultado.Cómo escribir la consulta MySQL donde A contiene ("a" o "b")

Pero, ¿cómo escribo esto? ¿Apoya MySQL algo así como

where A contains ('text 1' OR 'text 2')? ` 

Respuesta

26

Dos opciones:

  1. utilizar la palabra clave LIKE, junto con signos de porcentaje en la cadena

    select * from table where field like '%a%' or field like '%b%'. 
    

    (nota: Si la cadena de búsqueda contiene signos de porcentaje, que necesita para escapar de ellos)

  2. Si' re buscando más una compleja combinación de cuerdas que ha especificado en su ejemplo, usted podría expresiones regulares (regex):

    Consulte el manual de MySQL para más información sobre cómo utilizarlos: http://dev.mysql.com/doc/refman/5.1/en/regexp.html

De estos, usar LIKE es la solución más habitual: es SQL estándar, y de uso común. Regex se usa con menos frecuencia pero es mucho más poderoso.

Tenga en cuenta que independientemente de la opción que elija, debe tener en cuenta las posibles implicaciones de rendimiento. La búsqueda de sub-cadenas como esta significará que la consulta tendrá que escanear toda la tabla. Si tiene una tabla grande, esto podría generar una consulta muy lenta y ninguna cantidad de indexación ayudará.

Si esto es un problema para usted, y tendrá que buscar las mismas cosas una y otra vez, puede preferir hacer algo como agregar un campo de indicador a la tabla que especifique que el campo de cadena contiene las subcadenas relevantes Si mantiene este campo de indicador actualizado cuando inserta la actualización de un registro, puede simplemente consultar el indicador cuando desee buscar. Esto puede ser indexado, y haría su consulta mucho más rápida. Si vale la pena el esfuerzo de hacer eso depende de usted, dependerá de qué tan malo sea el rendimiento utilizando LIKE.

+0

2da opción ayudada. ¡Gracias! – Hao

+0

Solo tenga cuidado al usar la instrucción 'o'. Lo mejor es usar paréntesis a su alrededor, como 'select * from table where (campo como '% a%' o campo como '% b%')'. Si tiene otras cláusulas 'AND' su consulta podría actuar como' SELECT * FROM TABLE WHERE (A = 1 Y B = 2 Y C = 3) O (D = 4) 'que generalmente no es lo que quiere. – Maximus

5

Usted puede escribir su consulta, así:

SELECT * FROM MyTable WHERE (A LIKE '%text1%' OR A LIKE '%text2%') 

El % es un comodín, lo que significa que se busca para todas las filas donde la columna A contiene ya sea texto1 o texto2

+0

pero tengo que usar el formato 'A operando B'.Esto es todo en las 3 variables que tengo que usar debido a la programación –

+2

Honestamente, no estoy seguro de que esto sea posible dentro de tus limitaciones ... cuando estamos comparando dos patrones completamente diferentes, debemos compararlos por separado, y el OR booleano existe para que podamos hacer esto. No conozco ninguna comparación de MySQL que nos permita hacer una comparación en cualquiera de los dos patrones con un solo operador. – jcrawfordor

+0

@nos: lo perdí, gracias. – alex

0

He utilizado la mayoría de las veces la opción ME GUSTA y funciona muy bien. Solo me gusta compartir una de mis últimas experiencias donde utilicé la función INSTR. Independientemente de las razones que me hicieron considerar estas opciones, lo importante aquí es que el uso es similar: instr (A, 'texto 1')> 0 o instr (A, 'texto 2')> 0 Otra opción podría ser : (instr (A, 'texto 1') + instr (A, 'texto 2'))> 0

Me gustaría ir con la opción LIKE '% text1%' O ME GUSTA '% text2%'. ... si no, espero que esta otra opción ayude a

Cuestiones relacionadas