2015-02-23 16 views
1

我不得不產生(在PostgreSQL,如果該事項)含有兩個和的商列的表,基本上是這樣的(很簡單):在沒有程序代碼的情況下處理PostgresQL中的除法錯誤 - 有可能嗎?

select name, sum(a)/sum(b), sum(c)/sum(d) 
from a_complex_nested_select_query_with_many_zeros 
group by name 
order by name; 

表有行數萬(不是太大),但是在少數情況下,在b或d之間求和會產生0,從而導致整個查詢失敗,並出現Divide by 0

在研究如何處理異常時,我只能找到PL/pgSQL Control Structures的信息,這似乎需要創建一個函數(但我不確定)。

我的問題當然是如何使這個查詢工作。答案也許有事情做與

  • 可以例外的非程序SQL被抓(PostgreSQL裏,也許?)
  • 這是其中的程序代碼是必要的情況下?
  • CASE..WHEN..ELSE..END結構可以避免這個問題(我被困在這裏,因爲它看起來像SUM()調用重複!),但它是有吸引力的,因爲我不知道足夠多關於Postgres知道異常捕獲是否有性能損失。
  • 有沒有辦法,再次沒有函數,確保SUM()在CASE表達式中計算一次?
  • 如果需要某個功能,它會是什麼樣子?

編輯通過「重複之稱爲」我的意思是,我知道我能

select name, 
    case when sum(b)=0 then null else sum(a)/sum(b) end, 
    case when sum(d)=0 then null else sum(c)/sum(d) end 

等等,但我不知道這是一件好事。 (我想有人會回答一個爲什麼 - 你不是個人資料 - 但我認爲可能有更好的辦法在那裏,某處。)

+0

對不起,我無法抗拒:你爲什麼不運行'解釋analyze',看看自己? PL/pgSQL中的異常處理相當昂貴,所以我會先測試'case'解決方案。如果你想使*確定*它只被評估一次,使用[公用表表達式](http://www.postgresql.org/docs/current/static/queries-with.html) – 2015-02-23 18:09:26

回答

1

nullif如果參數相等,將返回空值。通過null一個部門評估爲null

select 
    name, 
    sum(a)/nullif(sum(b), 0), 
    sum(c)/nullif(sum(d), 0) 
from a_complex_nested_select_query_with_many_zeros 
group by name 
order by name; 
+0

這非常好。誰會知道我的名字,如果它們是平等的,結果將是空的?完美的作品。 – 2015-02-25 02:37:10

相關問題