我不得不產生(在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
等等,但我不知道這是一件好事。 (我想有人會回答一個爲什麼 - 你不是個人資料 - 但我認爲可能有更好的辦法在那裏,某處。)
對不起,我無法抗拒:你爲什麼不運行'解釋analyze',看看自己? PL/pgSQL中的異常處理相當昂貴,所以我會先測試'case'解決方案。如果你想使*確定*它只被評估一次,使用[公用表表達式](http://www.postgresql.org/docs/current/static/queries-with.html) – 2015-02-23 18:09:26