2009-11-26 37 views
0

Where子句: 我應該在Proc中對值進行測試,但如果其中至少有一個值爲null,則結果應爲TRUE 。只有在BOTH NOT NULL(它是表中ID列的整數值)時,比較結果纔是FALSE。只有當兩個值都不爲空且不匹配時,Eval纔會將兩個值與FALSE進行比較

現在我有這個: ...

and nvl(nvl(b.account_id, account_id_), 0) = nvl(nvl(account_id_, b.account_id), 0) 

b.account__id - 在表(整數)列,account_id_ - 帕拉姆在同類型的PROC。

它的工作原理,但恕我直言,它看起來很奇怪,瞭解什麼是評估的目的。 所以我試圖讓它更易讀,但沒有真正好的結果。

我試過COALESCE - 但它需要檢查null,如果兩者都是空值。 LNNVL是一個不錯的選擇,但如果它們同等,它會給出FALSE,但在這種情況下我需要True。

有什麼好的想法?

回答

0

此:

and nvl(nvl(b.account_id, account_id_), 0) = nvl(nvl(account_id_, b.account_id), 0) 

...是一樣的:

AND COALESCE(b.account_id, account_id_, 0) = COALESCE(account_id_, b.account_id, 0) 

兩者都過於複雜。如果您的參數爲null,則對b.account_id沒有過濾條件,因爲該值將與其自身匹配,或者空值將落入0,因此相等。

你有你以下選擇:

AND b.account_id = COALESCE(account_id_, b.account_id) 
AND (account_id_ IS NULL OR b.account_id = account_id_) 

兩者都是便攜式的語法,但我對使用COALESCE避免OR S的緣故瘦在可能的,因爲維護和sargability關注。

+0

我喜歡COALESCE變體,'0' - 沒關係。 我不喜歡第二個,因爲2個evals - 它也很複雜。 感謝您指出COALSCE與零 - 我錯過了這一點。 – zmische 2009-11-27 06:49:05

2

如果我的理解是正確的,這應該這樣做:
(b.account_id IS NULL OR account_id_ IS NULL OR b.account_id = account_id_)

+0

儘可能簡單!嗯...明天早上我應該考慮一下))) – zmische 2009-11-26 21:14:05

相關問題