如何在条件更新中重新分配两个变量

Goo*_*bot 5 mysql update

考虑一个简单的更新为

SET @var1 = 20;
SET @var2 = 26;
UPDATE table1 SET
    col1=IF(@var1>50, @var1 := @var1-col4, @var1 := @var1+col5),
    col2=IF(@var2>50, @var2 := @var2-col6, @var2);
Run Code Online (Sandbox Code Playgroud)

我们如何在一种情况下改变两个变量。例如,考虑当 时@var1<50,我们不仅要更改@var1 := @var1+col5,还要重新分配@var2 := @var2 + 100。事实上,不管条件2,@var2如果第一个条件失败(第二部分),我们要增加。

是否可以在 a 中重新分配两个用户变量,IF STATEMENT或者我们需要添加另一个IF STATEMENT

这将相当于

SET @var1 = 20;
SET @var2 = 26;
UPDATE table1 SET
    col1=IF(@var1>50, @var1 := @var1-col4, @var1 := @var1+col5),
    virtual_col=IF(@var1>50, NULL, @var2 := @var2+100),
    col2=IF(@var2>50, @var2 := @var2-col6, @var2);
Run Code Online (Sandbox Code Playgroud)

在这里,我们已经创建了一个无用的列,而不是收集数据,但重复IF STATEMENT@var2。显然,从性能的角度来看,这并不好,因为我们正在运行一个无用的UPDATE动作。

Shl*_*ach 6

可以在一个IF语句中进行两个赋值。

有几种方法;我提出一个,使用CASE语句:

SET @var1 = 20;
SET @var2 = 26;
UPDATE table1 SET
    col1=IF(
      @var1>50, 
      @var1 := @var1-col4, 
      CASE
        WHEN @var1 := @var1+col5 IS NULL THEN NULL
        WHEN @var2 := @var2 + 100 IS NULL THEN NULL
        ELSE @var1
      END
    ),
col2=IF(@var2>50, @var2 := @var2-col6, @var2);
Run Code Online (Sandbox Code Playgroud)

这个想法是创建一个CASE语句,其中第一个WHEN子句失败。他们失败是因为我们希望他们失败,但在他们的过程中,他们得到了评估。

但是为了让它们得到评估,它们必须首先计算赋值表达式,例如@var1 := @var1+col5and @var2 := @var2 + 100

CASE表达式从第一个WHEN子句到下一个子句工作,并且必须按此顺序工作。

请考虑在我去年的 Percona Live London (2011) 会议的介绍中阅读更多相关信息。作为参考,相关幻灯片为13 - 15程序查询:可以使用 sql 编码的内容