在 SELECT 语句中声明和使用变量
在 SQL 中,为变量赋值并在同一查询中检索该值可以具有挑战性。考虑以下示例:
SELECT @z:=SUM(item), 2*@z FROM TableA;
此查询尝试计算“item”列的总和并将其存储在名为“@z”的变量中。然后它将“@z”的值乘以 2。然而,令人惊讶的是,第二列总是返回 NULL。
出现这种情况是因为 MySQL 的文档明确指出将值分配给用户变量并在不应依赖同一声明。此类表达式的求值顺序未定义,并且可能会在未来版本中发生更改。
为了进一步说明这一点,请考虑替代查询:
SELECT @z:=someProcedure(item), 2*@z FROM TableA;
在此查询中,“@z”是通过过程调用分配一个值。在这种情况下,查询按预期工作,因为过程调用是与变量分配分开评估的。
要克服用户变量的限制,您可以利用子查询来分配值并在主查询中检索它查询:
select @z, @z*2 from (SELECT @z:=sum(item) FROM TableA ) t;
在此子查询中,使用 SELECT 分配“@z”的值。然后主查询选择“@z”并执行必要的计算。
以上是为什么在单个 SQL SELECT 语句中使用变量经常返回意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!