2015-03-02 141 views
0

嗨我想知道是否可以假设SELECT语句选择字段从左到右以确保构建语句的安全性如下(它不会是很好的尝试使用has't设定的变量):在SELECT语句中设置变量mysql

SELECT @variable := IFNULL(var, 0), value + @variable, somevalue, value2*@variable, ..., @variable/whatever... 

FROM table1 LEFT JOIN table2 LEFT JOIN table3 

我问这个问题的原因是因为它有可能变种在一些到期的元组等于空使用LEFT JOINS(让我们假设var来自表3),并且我需要多次使用变量来生成微分字段,所以我不想每次都使用IFNULL(var,0) 。

+1

我不明白投票的原因,我是新手到SQL,但我不认为这个问题是无关紧要或愚蠢的! – user1792210 2015-03-02 06:11:19

回答

2

the docs(与强调):

作为一般规则,比SET陈述之外,你永远不应该 一个值分配给一个用户变量和相同的 内读取值声明。例如,为了增加一个变量,这是好的:

SET @a = @a + 1; 

对于其他的语句,如SELECT,你可能让你 预期的结果,但是这是不能保证。在下面的语句,你 可能会认为MySQL将评估@a第一,然后做一个 分配第二:

SELECT @a, @a:[email protected]+1, ...; 

然而,评估的涉及用户的表达顺序 变量是未定义

所以,如果我们通过这本书去,回答你的问题是NO

+0

好吧,我已经阅读了一本关于mysql的书,但是没有提到你刚刚解释过的内容。谢谢。 – user1792210 2015-03-02 06:20:07

+0

只是要清楚。有相当多的例子在相同的'SELECT'语句中使用多个内联分配(包括这里的SO)。但这一切都在*** *** ***类别中。 – 2015-03-02 06:25:19