【问题标题】:MySQL variable get NULL from SUM()MySQL 变量从 SUM() 获取 NULL
【发布时间】:2015-11-24 14:48:28
【问题描述】:

我有这个 MySQL 语句:

SELECT  @my_sum := SUM(delibera.particolari_prodotti),
@my_sum_copy := @my_sum + 1
FROM delibera

我不明白为什么@my_sum 有一个数值但@my_sum_copy 是NULL。

我也试过这个:

SELECT  @my_sum := SUM(delibera.particolari_prodotti),
@my_sum_copy := CONVERT(@my_sum, UNSIGNED) + 1
FROM delibera

...还有这个:

SELECT  @my_sum := CONVERT(SUM(delibera.particolari_prodotti), UNSIGNED),
@my_sum_copy := @my_sum + 1
FROM delibera

但它是一样的。

我怎样才能知道@my_sum_copy 有一个有效的数值?

非常感谢。

更新: 用代码

SELECT
    @`my_sum`,
    @`my_sum_copy` := @`my_sum` + 1
    FROM 
    (
        SELECT
            @`my_sum` := SUM(`particolari_prodotti`)
        FROM
        `delibera`,
            (SELECT
                @`my_sum` := NULL,
                @`my_sum_copy` := NULL
            ) `inner_der` 
        ) `outer_der`;

我终于有了@my_sum_copy 的值。

但现在 @my_sum 设置为 [BLOB - 8 B]。

【问题讨论】:

  • 根据manual,这些表达式的求值顺序是未定义的。在这种情况下,这意味着 @my_sum := ...@my_sum_copy :=... 之后进行评估。您可能应该找到一种更强大的方法来做您需要的事情。
  • @Vatev:未定义,但在过去很长一段时间里,mysql 的评估/计算的东西左-> 右。虽然不能保证未来的行为,但它至少是半可靠的行为。
  • 是的,它的行为仍然是半可靠的:它并不总是按照您的预期进行 :)

标签: mysql variables integer sum


【解决方案1】:

来自文档:

9.4 User-Defined Variables

...

作为一般规则,除了在 SET 语句中,您不应该 为用户变量赋值并读取相同的值 声明。

...

对于其他语句,例如 SELECT,您可能会得到预期的结果,但这不能保证。

...

...,涉及用户变量的表达式的求值顺序未定义。

...

一个有用的选项是使用子查询:

SELECT
  @`my_sum`,
  @`my_sum_copy` := @`my_sum` + 1
FROM 
  (
    SELECT
      @`my_sum` := SUM(`particolari_prodotti`)
    FROM
      `delibera`,
      (SELECT
         @`my_sum` := NULL,
         @`my_sum_copy` := NULL
      ) `inner_der` 
  ) `outer_der`;

SQL Fiddle demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2018-08-09
    • 1970-01-01
    相关资源
    最近更新 更多