2010-10-21 27 views
15

quiero saber si hay una manera de utilizar una variable definida por el usuario en WHERE cláusula, como en este ejemplo:MySQL variable definida por el usuario en la cláusula WHERE

SELECT id, location, @id := 10 FROM songs WHERE id = @id 

Esta consulta se ejecuta sin errores, pero no funciona como se esperaba

+0

¿Qué esperas que haga la consulta? –

+0

En el escenario real, quiero definir una variable para obtener el desplazamiento LOCATE() de una subcadena en un campo. Lo uso muchas veces en la declaración SELECT. El problema es que quiero mostrar solo resultados que tengan este desplazamiento mayor que cero. Sé que puedo usar otro LOCATE() en la cláusula WHERE, pero ¿por qué esta variable no funciona en la cláusula WHERE? –

Respuesta

16

No muy lejos de lo que Mike E. propuso, pero una declaración:

SELECT id, location FROM songs, (SELECT @id := 10) AS var WHERE id = @id; 

Solía ​​consultas similares para emular las funciones de ventana en MySQL. P.ej. Row sampling - sólo un ejemplo de uso de variables en la misma declaración

+0

Subconsulta en la cláusula FROM ... ¡qué truco tan útil! ¡Gracias! :) –

3

Claro, pero nunca he visto a nadie tratar de establecer una variable y usarla en la misma declaración como usted. Proveedores:

SET @id := 10; 
SELECT @id := 10 FROM songs WHERE id = @id; 

o

SELECT @id := 10 FROM songs; 
SELECT @id := 10 FROM songs WHERE id = @id; 

He usado ambos, y ambos parecen funcionar para mí.

+0

esto no parece funcionar ...!? – Raffael

10

Desde la página del manual de MySQL en User Defined Variables:

Como regla general, nunca se debe asignar un valor a una variable de usuario y leer el valor dentro de la misma declaración. Puede obtener los resultados que espera, pero esto no está garantizado.

Por lo que debe separar la asignación de la instrucción de selección:

SET @id = 10; 
SELECT id, location, @id FROM songs WHERE id = @id; 
0

Esto funcionó para mí!

SET @identifier = 7; 
SELECT * FROM test where identifier = @identifier; 
Cuestiones relacionadas