2011-03-30 29 views
3

我正在執行的計算可能包含除以0,在這種情況下,我想結果是一個任意值(55)。令我驚訝的是,用計算語句包裝計算並沒有完成這項工作!Netezza不會對案例陳述進行懶惰評估?

select case when 1=0 then 3/0 else 55 end 

ERROR HY000:0

這是爲什麼鴻溝?是否有另一種解決方法?

+0

也許它不斷摺疊。如果您嘗試使用真實數據呢? (類似的事情發生在SQL Server中,當select = 1,然後LOG(0)else 55 end') – 2011-03-30 10:25:04

+0

可能是這樣 - 這個失敗是由於常量。我會發布真正的查詢。 – ihadanny 2011-03-30 12:40:02

回答

4

好的,我是不準確的。這是「0分」與失敗的確切查詢:

select case when min(baba) = 0 then 55 else sum(1/baba) end from t group by baba

這看起來像一個懶惰的評價失敗了Netezza公司,如通知,我組由baba,所以每當巴巴是0,這也意味着min(baba)爲0,並且評估應該已經優雅地停止,而沒有達到1/baba的期限並且不能以0分割。對嗎?好吧,不。

我猜是這裏的疑難雜症和失敗原因是Netezza公司評估行條件,纔可以評估的總條款。因此,它必須在每一行評估1/babababa,只有這樣纔可以評估總條款min(baba)sum(1/baba)

所以,解決方法(對我來說)是:select case when min(baba) = 0 then 55 else 1/min(baba) end from t group by baba,它具有相同的含義。

+1

從我對Netezza查詢處理的理解來看,聚合是在主機上「在」FPGA上的可見性/限制引擎之後完成的。這可以解釋你的查詢失敗的原因,以及爲什麼你會看到它在rbr基礎上評估和處理行。從您在解決方法中編寫查詢的方式看來,您似乎將處理移至Netezza的「主機」部分,在聚合後應用。 – cairnz 2012-03-03 23:49:19