2009-04-29 14 views
14

Así,MySQL Comodín para "=" - ¿hay una

SELECT * FROM table WHERE col LIKE '%' 

devolverá todo. ¿Hay un comodín para la consulta

SELECT * FROM table WHERE col = '*' 

Claramente * no funciona, acabo de poner allí para indicar donde me gustaría un comodín. La columna que selecciono contiene un número entero entre 1 y 12, y quiero poder seleccionar todos los registros con un número particular o todos los registros con un comodín.

Gracias,

Respuesta

11

COMO es básicamente lo mismo que =, excepto que LIKE le permite usar comodines.

Estas dos consultas devolverá los mismos resultados:

SELECT * FROM table WHERE col LIKE 'xyz'; 
SELECT * FROM table WHERE col='xyz'; 

Sin un '%' en la consulta LIKE, es efectivamente el mismo que '='.

Si está haciendo una selección en una columna entera, debería considerar usar los operadores IN() o BETWEEN. Sin embargo, parece que tiene dos condiciones distintas que deben manejarse en su código, en lugar de en la consulta, ya que sus condiciones requieren que necesite al menos dos tipos diferentes de consultas.

Editar: Debo aclarar que LIKE y = son similares solo en el uso de comparación de cadenas normales y monótonas. Debería consultar el MySQL Manual para obtener detalles sobre cómo funciona, ya que hay situaciones en las que no es lo mismo (como conjuntos de idiomas).

+0

Gracias, justo lo que estaba buscando. Lo manejaré en código y cambiaré la consulta para incluir esa cláusula WHERE particular, siempre y cuando sea necesario. – Dan

+0

¿Soporta MySQL BETWEEN? Pensé que solo era TSQL –

+0

@Joe: BETWEEN es SQL estándar. Nunca he conocido ningún sistema compatible con SQL que no sea BETWEEN. –

7

La razón para usar LIKE es debido a que los = no ofrece soporte de comodines. De lo contrario, no habría motivo para LIKE

0
SELECT * FROM table WHERE col RLIKE '.*' 

i.e. expresión regular LIKE.

+0

Gracias por recordarme ese buen operador de MySQL. RLIKE aka REGEXP vale la pena saber: http://dev.mysql.com/doc/refman/5.1/en/regexp.html – artlung

8

Si desea seleccionar todo, ¿por qué está adjuntando la cláusula WHERE en absoluto? Simplemente déjelo apagado condicionalmente en lugar de ponerle un comodín.

+1

Estaba pensando eso, entonces pensé, no, eso no tiene sentido, solo debe estar usando el comodín como ejemplo y realmente él anclaría el texto en uno o ambos lados del mismo. Luego volví a leer la pregunta en detalle y no, tienes razón, solo tiene que dejar el DONDE para su aplicación. – chaos

+1

Dan, sabes que la parte WHERE es opcional, ¿no? Si lo dejas, entonces seleccionarás cada fila. – allyourcode

0

Asumiendo que su consulta está parámetro impulsado una declaración de caso es probablemente adecuada

select * from mytable 
where col like case when @myvariable is null then % else myvariable end 

Dónde @myvariable es o nula si no quieres un valor de otro modo sería utilizar el valor entero se pasa en.

0

La respuesta de zombat es genial, pero solo noté en su respuesta que está seleccionando enteros. Mencionó IN() y BETWEEN(). Aquí hay ejemplos que usan esas sintaxis, así como algunas otras opciones que tiene para un campo entero.

SELECT * FROM table WHERE col = 1; 
SELECT * FROM table WHERE col BETWEEN 1 AND 12; 
SELECT * FROM table WHERE col BETWEEN 6 AND 12; 
SELECT * FROM table WHERE col <= 6; 
SELECT * FROM table WHERE col < 6; 
SELECT * FROM table WHERE col >= 6; 
SELECT * FROM table WHERE col > 6; 
SELECT * FROM table WHERE col <> 6; 
SELECT * FROM table WHERE col IN (1,2,5,6,10); 
SELECT * FROM table WHERE col NOT IN (1,2,5,6,10); 
0

me he encontrado con un caso así, mientras que la construcción de un procedimiento almacenado para un informe que sigue es mi solución, espero que esto es lo que tenía en mente :)

set @p = "ALL"; 

Consulta:

select * from fact_orders 
where 
dim_country_id = if(@p is null or @p="ALL", dim_country_id, @p) 
limit 10 
; 
0

Si sus valores están en el rango (1,12) entonces:

seleccione * fro m tabla donde col> = 5 y col < = 5; // esto es igual a col = 5

select * from table donde col> = 0 y col < = 12; // esto es igual a col = cualquier valor

La misma línea puede producir ambos efectos eligiendo los 2 parámetros adecuadamente. Me enfrenté a un problema similar cuando necesitaba una única declaración preparada que debería funcionar de 2 maneras diferentes, ya sea verificando un valor particular en una columna o ignorando esa columna por completo.

Cuestiones relacionadas