您好我想知道是否可以假设SELECT
语句从左到右选择字段以确保构建语句是安全的以下(尝试使用尚未设置的变量并不好):
SELECT @variable := IFNULL(var, 0), value + @variable, somevalue, value2*@variable, ..., @variable/whatever...
FROM table1 LEFT JOIN table2 LEFT JOIN table3
我问这个问题的原因是因为使用LEFT JOINS可能因为某些元组中的var等于null(让我们假设var来自表3),我需要使用变量如你所见,我可以多次制作派生字段,所以我不想每次都使用IFNULL(var,0)。
答案 0 :(得分:2)
来自the docs(强调我的):
作为一般规则,除了
SET
语句之外,你永远不应该 为用户变量赋值并读取其中的值 声明。例如,要增加变量,这没关系:
SET @a = @a + 1;
对于其他语句,例如
SELECT
,您可能会获得结果 期待,但无法保证。在以下声明中,您 可能会认为MySQL会首先评估@a然后做一个 第二个任务:
SELECT @a, @a:=@a+1, ...;
然而,涉及用户的表达式的评估顺序 变量未定义。
所以,如果我们按照这本书去,你问题的答案是否。