2011-06-27 47 views
6

比較兩個值是否相等,如果它們可以是下列以外的空值,是否有比較好的方法?比較Oracle SQL中的空值

a = b or (a is null and b is null) 
+4

[在SQL中獲取null == null]的可能重複(http://stackoverflow.com/questions/191640/get-null-null-in-sql)。請注意,一般來說,雖然有更簡單的方法來編寫它,但它可能是最有效的方法,因爲沒有函數引用。 – DCookie

+0

我很好奇,如果那是真的,僅僅因爲'null'沒有括號,並不意味着函數沒有被調用;畢竟,比較仍然執行。我敢打賭,db已經爲'coalesce'優化過,因爲它經常被使用。我並不是說你錯了,只是用新的數據庫引擎進行基準測試會很有趣。 – vol7ron

+0

剛剛在11g實例上進行了測試。雖然不那麼戲劇性,但合併使用了大約10%以上的CPU。 – DCookie

回答

0

你可以用NVL包裹,並將其設置爲不期望在您所設定的某個值:

NVL(a,0) = NVL(b,0) 
+5

如果A爲0且B爲空,則結果不同。 –

+1

我認爲海特克暗示'0'是這個集合中沒有預期的價值。我認爲這是一個很好的例子,說明如何使代碼保留SQL註釋。這是有效的,但對程序員/維護人員來說,瞭解該領域的可能價值很重要;這可能是我避而遠之的原因 – vol7ron

5

您可以:

a=b or coalesce(a,b) is null 

你也可以使用nvl,但是傳統功能,並且​​3210更快,因爲它停在第一個非空

+2

這個答案有誤導性:'nvl'和'coalesce'在大多數用途(傳遞兩列或一列和一個靜態值)時表現等價。只有當第二個參數是一個函數或者一個複雜的評估(並且第一個參數爲空)時,coalesce纔會表現更好。 – Allan

+0

我想'nvl'只接受兩個參數,而'coalesce'將接受一個列表,所以是的,你是對的。另外需要注意的是,我相信'nvl'不需要嚴格的數據類型,而'coalesce'要求所有的數據類型都是相同的 - 這可能會對性能產生影響。 – vol7ron

4

您可以使用DECODE(A,B,1) = 1

DECODE在處理NULL時是不規則的。

但是我認爲目的不清楚並且更喜歡vol7ron的回答。清晰度最小化打字!

+0

'decode'非常有趣的用法; +1 – vol7ron