segundo - declarar variables en mysql ejemplos
MySQL-Defina una variable dentro de seleccione y úsela dentro de la misma selección (3)
¿Existe la posibilidad de hacer algo como esto?
SELECT
@z:=SUM(item),
2*@z
FROM
TableA;
Siempre obtengo NULL para la segunda columna. Lo extraño es que mientras se hace algo como
SELECT
@z:=someProcedure(item),
2*@z
FROM
TableA;
Todo funciona como se espera. ¿Por qué?
Funciona en mysql 5.5
select @code:=sum(2), 2*@code
+---------------+---------+
| @code:=sum(2) | 2*@code |
+---------------+---------+
| 2 | 4 |
+---------------+---------+
La documentation MySQL es bastante clara en esto:
Como regla general, nunca debe asignar un valor a una variable de usuario y leer el valor dentro de la misma declaración. Es posible que obtenga los resultados que espera, pero esto no está garantizado. El orden de evaluación de las expresiones que involucran variables de usuario no está definido y puede cambiar según los elementos contenidos en una declaración dada; Además, no se garantiza que este orden sea el mismo entre las versiones del servidor MySQL. En SELECCIONAR @a, @a: = @ a + 1, ..., podría pensar que MySQL evaluará @a primero y luego hará una asignación de segundo. Sin embargo, cambiar la declaración (por ejemplo, al agregar una cláusula GROUP BY, HAVING u ORDER BY) puede hacer que MySQL seleccione un plan de ejecución con un orden de evaluación diferente.
Puedes hacer lo que quieras usando una subconsulta:
select @z, @z*2
from (SELECT @z:=sum(item)
FROM TableA
) t;
mysql> select @z := sum(5), if(@z := sum(5), 2*@z, 0) ;
+--------------+------------------------------+
| @z := sum(5) | if(@z := sum(5), 2*@z, null) |
+--------------+------------------------------+
| 5 | 10 |
+--------------+------------------------------+
Creo que envolver el 2*@z
en la sentencia if
se asegurará de que la sum
se realice ANTES del cálculo adicional.