it-roy-ru.com

MySQL - определите переменную в select и используйте ее в том же select

Есть ли возможность сделать что-то подобное?

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

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

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

все работает как положено. Зачем?

22
user2370579

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

Как правило, вы никогда не должны присваивать значение пользовательской переменной и прочитайте значение в том же утверждении. Вы можете получить ожидаемых результатов, но это не гарантировано. Получатель чего-то оценка для выражений с участием пользовательских переменных не определена и может меняться в зависимости от элементов, содержащихся в данном утверждении; Кроме того, этот порядок не гарантированно будет одинаковым между выпуски 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;
27
Gordon Linoff

Работает в MySQL 5.5

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

+---------------+---------+
| @code:=sum(2) | 2*@code |
+---------------+---------+
|             2 |       4 |
+---------------+---------+
3
Ravi Parekh
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 ПЕРЕД дополнительным вычислением.

0
pala_