我使用mysql的变量赋值,我发现了一个奇怪的行为。
请参阅此查询:
SET @v1=0;
SET @v2=0;
SELECT @v1, @v2
FROM MyTable table
WHERE (@v1:=@v2) is not null
AND (@v2:=2) is not null;
我原以为按此顺序解析条件:
第一个(@v1:=@v2) is not null
并在(@v2:=2) is not null
之后
所以结果必须是:
@v1 | @v2
---------
0 | 2
但事实并非如此。尝试此查询,您将拥有:
@v1 | @v2
---------
2 | 2
为什么?
答案 0 :(得分:1)
SQL是一种声明性语言,因此您不能假设您的条件按您编写它们的顺序进行评估。您告诉引擎您想要什么,可以自由决定如何获取。
答案 1 :(得分:0)
优化器不一定使WHERE子句中的表达式顺序与查询相同。您不能依赖任何特定的评估顺序
答案 2 :(得分:0)
查询优化器可以以任何方式自由地重写和执行代码。不要依赖它以你期望的任何方式工作。