2016-04-03 37 views
2

我有一個MySQL表,其字段進來組,規則是每行只有一個組正在使用,並且所有(且只有)該組的字段都是非空的。爲什麼(x IS NULL!= y IS NULL)在MySQL中需要額外的括號?

要明確,讓我們來看看其中的一些領域

x_encrypted 
x_hashed 
y_encrypted 
y_hashed 

我有信號故障觸發的,如果你插入一個不良記錄。其中一項支票是這樣的

IF (x_encrypted IS NULL != x_hashed IS NULL) ... error 

即即x既加密又散列,或者它不存在。

在觸發錯誤的情況下,兩個x_encrypted IS NULL AND x_hashed IS NULL。解決方法是重新編寫它像這樣,有額外的括號:

IF ((x_encrypted IS NULL) != (x_hashed IS NULL)) ... error 

爲什麼這些額外的支架需要?我看不出這會如何在語法上模糊不清。我擔心有一個陷阱等待着我,我在其他地方也有類似的與NULL相關的檢查,我不再相信。

回答

3

根據documentationIS!=具有相同的優先級。另外:

對於在表達式中出現在相同優先級別的運算符,評估從左到右進行,但賦值從右向左評估。

這意味着,這個表達式:

x_encrypted IS NULL != x_hashed IS NULL 

會進行評估:

((x_encrypted IS NULL) != x_hashed) IS NULL 

所以,你必須用括號明確覆蓋評估的默認順序。