MySQL. Определите переменную внутри select и используйте ее в пределах одного выбора.

Есть ли возможность сделать что-то вроде этого?

SELECT 
    @z:=SUM(item),
    2*@z
FROM
    TableA;

Я всегда получаю NULL для второго столбца. Странно, что, делая что-то вроде

SELECT 
    @z:=someProcedure(item),
    2*@z
FROM
    TableA;

все работает так, как ожидалось. Почему?

Ответ 1

MySQL документация совершенно понятна:

Как правило, вы никогда не должны присваивать значение пользовательской переменной и прочитайте значение в пределах одного и того же оператора. Вы можете получить ожидаемых результатов, но это не гарантируется. Получатель чего-то оценка выражений с использованием пользовательских переменных undefined и может изменяться на основе элементов, содержащихся в данном заявлении; кроме того, этот порядок не гарантируется одинаковым между выпусков MySQL Server. В SELECT @a, @a: = @a + 1,..., вы можете подумайте, что MySQL сначала оценит @a, а затем выполнит задание второй. Однако, изменяя утверждение (например, добавляя GROUP BY, HAVING или ORDER BY) может заставить MySQL выбрать план выполнения с другим порядком оценки.

Вы можете делать то, что хотите, с помощью подзапроса:

select @z, @z*2
from (SELECT @z:=sum(item)
      FROM TableA
     ) t;

Ответ 2

Работает в mysql 5.5

select @code:=sum(2), 2*@code

+---------------+---------+
| @code:=sum(2) | 2*@code |
+---------------+---------+
|             2 |       4 |
+---------------+---------+

Ответ 3

mysql> select @z := sum(5), if(@z := sum(5), 2*@z, 0) ;
+--------------+------------------------------+
| @z := sum(5) | if(@z := sum(5), 2*@z, null) |
+--------------+------------------------------+
|            5 |                           10 |
+--------------+------------------------------+

Я полагаю, что обертка 2*@z в операторе if обеспечит выполнение sum ДО дополнительных вычислений.