[英]Avoid divide by zero with an IF SQL
我有這個查詢:
SELECT sum((a.cant*b.cost)/b.cant) AS sum1
FROM
(SELECT partNo,cant
FROM table1 WHERE id=1) AS a,
(SELECT color,cost,cant
FROM table2 WHERE color in
(SELECT partNo FROM table1 WHERE id=1)) AS b
WHERE a.partNo=b.color
問題是有時b.cant會返回0 ,當我執行此部分時: SELECT sum((a.cant*b.cost)/b.cant) AS sum1它會返回除以零錯誤消息,我是考慮做這樣的事情:
SELECT IF (b.cant=0,0,sum((a.cant*b.cost)/b.cant)) AS sum1
這意味着如果b.cant等於 0,那么我想返回 0 作為最終結果並停止進行除法,但如果它不等於 0,那么我將進行除法,在我看來,這是解決方案,但給了我一個錯誤。
如果除數為0,是否有任何其他方法可以避免進行除法並僅返回0?
您應該使用JOIN
而不是使用select
語句選擇列。 為避免0
,您應該使用case
表達式,如下所示
select
sum((a.cant*b.cost)/b.can) as sum1
from
(
select
a.partNo,
a.cant,
b.color,
b.cost,
(case when b.cant = 0 then 1 else b.cant) as b.cant
from table1 a
join table2 b
on a.partNo = b.color
where a.id = 1
) subq
當b.cant
為0
時,您可以使用NULLIF()
返回NULL
:
SUM(a.cant * b.cost / NULLIF(b.cant, 0))
如果存在最終總和返回NULL
但您想看到0
的情況,那么也使用COALESCE()
:
COALESCE(SUM(a.cant * b.cost / NULLIF(b.cant, 0)), 0)
您應該修復您的JOIN
語法並簡化查詢:
SELECT SUM(a.cant*b.cost) / NULLIF(b.cant, 0) AS sum1
FROM table1 a JOIN
table2 b
ON a.partNo = b.color AND
a.id = b.id
WHERE a.id = 1;
連接條件在“partno”和“color”之間是相當可疑的,但這就是您在查詢中的措辭方式。 如果這是一個錯誤,我不會感到驚訝。
您的具體問題的答案是NULLIF()
。 但是您還應該學習如何編寫更清晰的 SQL 代碼。 特別是,切勿在FROM
子句中使用逗號。 學習使用正確的、明確的、標准的、可讀的JOIN
語法。
業務方面,可以判斷b.cant
等於0,如果b.cant
等於0則默認即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.