簡體   English   中英

避免在 PostgreSQL 中被零除

[英]Avoid division by zero in PostgreSQL

我想在 SELECT 子句中執行除法。 當我加入一些表並使用聚合函數時,我經常使用空值或零值作為分隔符。 至於現在我只提出了這種避免除以零和空值的方法。

(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END) 

我想知道是否有更好的方法來做到這一點?

您可以使用NULLIF函數,例如

something/NULLIF(column_name,0)

如果column_name值為 0 - 整個表達式的結果將為 NULL

由於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

trueinteger為 1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM