2011-10-10 20 views
1

我寫的觸發器來檢測在數據庫領域的變化,看來我要做真正討厭的東西像爲什麼NULL字段被調用相等?

(SELECT SalesPrice FROM __old) <> (SELECT SalesPrice FROM __new) 
or ((SELECT SalesPrice FROM __old) IS NULL and (SELECT SalesPrice FROM __new) IS NOT NULL) 
or ((SELECT SalesPrice FROM __old) IS NOT NULL and (SELECT SalesPrice FROM __new) IS NULL) 

,而不是僅僅

(SELECT SalesPrice FROM __old) <> (SELECT SalesPrice FROM __new) 

準確地檢測一個字段改變。

我錯過了什麼,或者Advantage有效地聲稱NULL ==任何值?這種行爲有充分的理由嗎?這是SQL定義中的一些奇怪的事情嗎?有沒有更簡潔的方式,這不會做3檢查代替嗎?

回答

3

這很不幸,SQL如何處理NULL值。 NULL不等於任何東西,它是UNKNOWN。例如, someValue中== NULL - >未知 someValue中<> NULL - >未知

因此,它絕不會通過一個 「真」 檢查 Null Values - Wikipedia

有幾個選項: 一)不要允許空值(我建議使用默認值結合本) B)使用IFNULL將字段設置爲某個值,如

(SELECT IFNULL(SalesPrice, -9999) FROM __OLD) <> (SELECT IFNULL(SalesPrice, -9999) FROM __NEW) 

但我不知道我是否一定喜歡這個因爲必須選取一個無效的值。

+0

這不是不幸;它非常有意義。如果兩列沒有價值,那麼這些不存在的值如何比較相等?你會發現與IEEE NaN值相同的東西。 –

+0

@Tomalak我的問題是,當一列NULL,SQL有效地說,它是等於一切。我知道SQL並不完全是一種編程語言,但它使用了許多語言,它們都假定NULL == NULL,沒有別的東西,所以你可以從可能彈出NULL的比較中得到一個合理的結果。 –

+0

@埃德加 - 是的,不允許空值可以在某些情況下工作,但有0和沒有決定(例如)之間的差異。但是,如果IFNULL能夠很好地工作,我可以輕鬆找到合適的無效值用於比較。謝謝。 –

1

在SQL中,除了IS [NOT] NULL表達式外,NULL不會與任何東西進行比較。如果我正確地理解你的問題,這裏的問題是NULL必須等於NULL。如果是這種情況,支票可以簡化爲:

(SELECT CASE WHEN n.SalesPrice IS NULL and o.SalePrice IS NULL THEN TRUE 
     ELSE n.SalesPrice = o.SalesPrice END 
    FROM __old o, __new n) 
相關問題