【问题标题】:COALESCE and IFNULL does not return 0 when using ISNULL(example,0) in MySQL db在 MySQL db 中使用 ISNULL(example,0) 时,COALESCE 和 IFNULL 不返回 0
【发布时间】:2016-12-16 23:44:15
【问题描述】:

在查询我的 MySQL 数据库时,我试图返回 0 而不是什么都没有,因为我有一个带有图表和表格的网页,其中许多重要的行没有显示,因为查询返回 null。这是我原来的 SQL 语句:

SELECT Department, SUM(ExtVal) AS ExtVal, SUM(Quantity) AS Quantity
FROM Table1 WHERE Code <> 'AA' AND Code <> 'BB'
GROUP BY Department
ORDER BY Department

上述语句仅返回 2 个部门的数据,因为其他部门为空。这是我更新的 SQL 语句:

SELECT Department, SUM(COALESCE(ExtVal,0)) AS ExtVal, SUM(COALESCE(Quantity, 0)) AS Quantity
FROM Table1 WHERE Code <> 'AA' AND Code <> 'BB'
GROUP BY Department
ORDER BY Department

尽管有 4 个部门,但它只返回 2 个部门的数据。当我从终端运行我的 php 脚本时没有错误,我可以访问显示此数据且没有错误的网页。我尝试用 ISNULL 替换 COALESCE 函数,但它仍然不起作用。

这是输出的一些示例数据:

这是我想要输出的一些示例数据:

【问题讨论】:

  • 如果您尝试使用SUM(CASE WHEN ExtVal IS NULL THEN 0 ELSE ExtVal END) 而不是SUM(COALESCE(ExtVal,0)),会发生什么?
  • 发布该表中的示例数据。
  • 抱歉耽搁了,我现在添加了一些图片
  • 您仍然需要发布一些示例 input 数据。
  • @sstan 信息直接来自 MySQL 数据库,属于机密,我不能发布。

标签: mysql sql coalesce isnull


【解决方案1】:

为什么不只是:

SELECT Department, 
   COALESCE(SUM(ExtVal),0) AS ExtVal, 
   COALESCE(SUM(Quantity), 0) AS Quantity
FROM Table1 WHERE Code <> 'AA' AND Code <> 'BB'
GROUP BY Department
ORDER BY Department

我想那是更好的表现

【讨论】:

  • 还是不行。我想我也需要为 Department 设置一个 COALESCE,因为那也将是空的。但是当我做 COALESCE (Department, Department) AS Department 时,它会做同样的事情。
  • 请提供sqlfiddle
  • COALESCE 返回列表中的第一个非空元素。 @迈克尔
【解决方案2】:

听起来您的过滤器WHERE Code &lt;&gt; 'AA' AND Code &lt;&gt; 'BB' 完全排除了某些从未出现在您的结果中的部门。

如果您想确保每个部门都获得一行,那么您可以根据Code字段有条件地使用聚合,而不是过滤Code

select department,
       coalesce(sum(case when code <> 'AA' and code <> 'BB' then ExtVal end), 0) as ExtVal,
       coalesce(sum(case when code <> 'AA' and code <> 'BB' then Quantity end), 0) as Quantity
  from Table1
 group by Department
 order by Department

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多