2015-08-14 42 views
0

以下查詢生成不同的計數。在我看來,它們是相同的。使用COALESCE和OR的SQL Server結果有所不同

SELECT 
    COUNT(*) 
FROM 
    item1 
RIGHT JOIN 
    (Item2 
INNER JOIN 
    item_master ON Item2.Number = item_master.number) AND (item1.itemId = Item2.itemId) 
WHERE 
    COALESCE([Item2].[Amount], item1.Amount, [item_master].[amount], 0) > 0 

SELECT 
    COUNT(*) 
FROM 
    item1 
RIGHT JOIN 
    (Item2 
INNER JOIN 
    item_master ON Item2.Number = item_master.number) AND (item1.itemId = Item2.itemId) 
WHERE 
    (Item2.Amount is not NULL and Item2.Amount > 0) OR 
    (item1.Amount is not NULL and item1.Amount > 0) OR 
    (item_master.amount is not NULL and item_master.amount > 0) 
+0

額外的','在COALESCE' 0'參數是不必要的和-IN我意見混淆。 – GolezTrol

+0

但是不是NULL> 0的問題? – phpdev76

+0

這會導致錯誤,就像'0> 0'一樣。 :)你也不需要在第二個查詢中使用'Item2.Amount不是NULL'和類似的檢查。 – GolezTrol

回答

5

它們不同。 COALESCE([Item2].[Amount], item1.Amount, [item_master].[amount], 0) > 0爲真,如果三者的第一個非空值,如果有任何非空值大於0

+0

,但評估時不一樣嗎? – phpdev76

+0

否。如果Item2.Amount爲0且item1.Amount爲1,則無論Item1.Amount中的「1」如何,COALESCE仍將返回0並且整個表達式(0> 0)將爲false。在普通英語中,「First non-null」和「Any」之間的區別有很大不同。 – GolezTrol

+0

謝謝!不知道爲什麼它沒有點擊之前 – phpdev76

0

這裏更大大於0

第二個條件是真就是爲什麼他們是不同的:合併只會對第一個非空值進行評估。第二個查詢將接受3個輸入中的任何一個進行評估。

取例如值[-1,5,空]

  • 所述第一查詢:評估爲假,因爲-1 < = 0
  • 所述第二查詢:5> 0,所以它評估爲真。

,如果你想在第一個查詢中使用聚結,你會想要做這樣的事情:

where (coalesce(item2.amount, 0) > 0 
or coalesce(item1.amount, 0) > 0 
or coalesce(item_master.amount, 0) > 0)