[英]Avoid division by zero in PostgreSQL
我想在 SELECT 子句中執行除法。 當我加入一些表並使用聚合函數時,我經常使用空值或零值作為分隔符。 至於現在我只提出了這種避免除以零和空值的方法。
(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END)
我想知道是否有更好的方法來做到這一點?
由於count()
從不返回NULL
(與其他聚合函數不同),因此您只需捕獲0
情況(無論如何這是唯一有問題的情況)。 因此,您的查詢簡化了:
CASE count(column_name)
WHEN 0 THEN 1
ELSE count(column_name)
END
或者更簡單,但是,使用NULLIF()
,就像 Yuriy 提供的一樣。
需要注意的是,除了
count
之外,當沒有選擇任何行時,這些函數返回一個空值。
我意識到這是一個老問題,但另一個解決方案是利用最大的功能:
greatest( count(column_name), 1 ) -- NULL and 0 are valid argument values
注意:我的偏好是要么返回 NULL,如 Erwin 和 Yuriy 的回答,要么通過在除法運算之前檢測值是0
並返回0
來邏輯地解決這個問題。 否則,數據可能會因使用1
而被歪曲。
避免除以零的另一種解決方案,替換為1
select column + (column = 0)::integer;
如果您希望在計數為零時分頻器為 1:
count(column_name) + 1 * (count(column_name) = 0)::integer
從true
到integer
為 1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.