簡體   English   中英

使用 IF SQL 避免除以零

[英]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.cant0時,您可以使用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.

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