考虑一个简单的更新为
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
动作。
可以在一个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+col5
and @var2 := @var2 + 100
。
CASE
表达式从第一个WHEN
子句到下一个子句工作,并且必须按此顺序工作。
请考虑在我去年的 Percona Live London (2011) 会议的介绍中阅读更多相关信息。作为参考,相关幻灯片为13 - 15:程序查询:可以使用 sql 编码的内容
归档时间: |
|
查看次数: |
11401 次 |
最近记录: |