【问题标题】:Avoid divide by zero with an IF SQL避免使用 IF SQL 除以零
【发布时间】:2020-06-12 05:17:16
【问题描述】:

我有这个问题:

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?

【问题讨论】:

  • (很明显,)这是一个常见问题解答。请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。
  • 这能回答你的问题吗? How do I perform an IF...THEN in an SQL SELECT?
  • 在 SQL 中执行 IF 的构造是 CASE 构造。 SELECT CASE WHEN b.cant=0 THEN 0 ELSE sum((a.cant*b.cost)/b.cant) END AS sum1 docs.microsoft.com/en-us/sql/t-sql/language-elements/…

标签: sql sql-server tsql join


【解决方案1】:

您应该修复您的 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 语法。

【讨论】:

    【解决方案2】:

    您应该使用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
    

    【讨论】:

      【解决方案3】:

      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)
      

      【讨论】:

        【解决方案4】:

        在业务方面,可以判断b.cant等于0,如果b.cant等于0则默认即可。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-26
          • 1970-01-01
          • 2019-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多