2015-03-02 129 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