【问题标题】:temporary variable manipulation visibility in SELECTSELECT 中的临时变量操作可见性
【发布时间】:2018-09-01 05:33:11
【问题描述】:

MySQL 中如何定义临时变量操作?似乎值的任何更改都将在赋值表达式之后立即“可见”。如果我运行查询

SELECT 
  @x as x,
  @x + (@x:=@x+1) + @x as magic,
  @x as new_x
FROM 
  (SELECT @x:=0) x,
  Values1to100 numbers

返回

+---+-------+-------+
| x | magic | new_x |
+===+=======+=======+
| 0 |     2 |     1 |
+---+-------+-------+
| 1 |     5 |     2 |
+---+-------+-------+
| 2 |     8 |     3 |
+---+-------+-------+
| ...               |

现在我想知道这是不是 MySQL(或一般的 SQL)定义明确的行为(即结果取决于实现)?

【问题讨论】:

    标签: mysql sql variables select variable-assignment


    【解决方案1】:

    MySQL documentation

    对于诸如 SELECT 之类的语句,您可能会得到预期的结果,但这并不能保证。在下面的语句中,你可能会认为 MySQL 会先评估 @a,然后再进行赋值:

    SELECT @a, @a:=@a+1, ...;
    

    但是,涉及用户变量的表达式的计算顺序是未定义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 2011-07-30
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多