2013-07-04 30 views
2

我一直在使用SQLServer多年,現在始終都有使用延遲評估的CASE表達式的想法,該工具可以在實際嘗試執行操作之前檢查字符串值是否包含有效日期轉換它。在SQL中進行評估時的情況

今天我發現這似乎不正確的情況。一些經過簡化,這是一個簡單的例子來說明它(不要試圖尋找任何意義的計算,只是一個傻瓜的例子):

select b, sum(case when b<> 0 then a/b end) 
from (
    select 1 as a, 1 as b union select 1, 0 union select 0, 1 
) x group by b 

這工作得很好,因爲我期望的那樣。

select b, case when b<> 0 then sum(a/b) end 
from (
    select 1 as a, 1 as b union select 1, 0 union select 0, 1 
) x group by b 

這會引發錯誤(零分)。

似乎與聚合函數有關的東西,不知何故,總和在案件之前進行評估,但我必須缺少一些東西,不知道是什麼。

我對此很感興趣,因爲有一些解決方法,並沒有真正的問題。

順便說一句,我已經在SQLServer 2005和SQLServer 2008上測試了它,然後在Oracle 11g上測試了它,結果始終如一。

回答

2

在第二個版本中,必須爲整個結果集計算聚合sum(a/b),因爲其中沒有每行條件。然後每行決定是否使用CASE表達式包含該值。