MySQL - 在select中定义一个变量并在同一个select中使用它

use*_*579 23 mysql variables select procedure mysql-variables

有没有可能做这样的事情?

SELECT 
    @z:=SUM(item),
    2*@z
FROM
    TableA;
Run Code Online (Sandbox Code Playgroud)

对于第二列,我总是得到NULL.奇怪的是,在做某事的同时

SELECT 
    @z:=someProcedure(item),
    2*@z
FROM
    TableA;
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.为什么?

Gor*_*off 29

MySQL 文档非常明确:

作为一般规则,您不应该为用户变量赋值并在同一语句中读取值.您可能会得到您期望的结果,但这不能保证.涉及用户变量的表达式的评估顺序是未定义的,可能会根据给定语句中包含的元素进行更改; 此外,MySQL服务器版本之间的订单不保证相同.在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;
Run Code Online (Sandbox Code Playgroud)

  • 查询是一个相当复杂的查询,所以我不想再添加子查询.为什么它与程序一起工作?在程序上使用变量比使用程序两次快得多.所以我只是不明白,为什么这不应该与sum(item)一起工作. (3认同)