如果找不到值,如何在MySQL中获取SUM函数以返回“ 0”?


150

说我在MySQL中有一个简单的函数:

SELECT SUM(Column_1)
FROM Table
WHERE Column_2 = 'Test'

如果Column_2中没有任何条目包含文本'Test',则此函数返回NULL,而我希望它返回0。

我知道这里曾多次问过类似的问题,但我仍无法根据自己的目的调整答案,因此,我很感谢能为您提供一些帮助。


Answers:


305

使用COALESCE以避免这种结果。

SELECT COALESCE(SUM(column),0)
FROM   table
WHERE  ...

要查看它的实际效果,请参阅以下sql小提琴:http ://www.sqlfiddle.com/#!2/d1542/3 /0


更多信息:

给定三张表(一张带有所有数字,一张带有所有空值,一张带有混合数):

SQL小提琴

MySQL 5.5.32模式设置:

CREATE TABLE foo
(
  id    INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  val   INT
);

INSERT INTO foo (val) VALUES
(null),(1),(null),(2),(null),(3),(null),(4),(null),(5),(null),(6),(null);

CREATE TABLE bar
(
  id    INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  val   INT
);

INSERT INTO bar (val) VALUES
(1),(2),(3),(4),(5),(6);

CREATE TABLE baz
(
  id    INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  val   INT
);

INSERT INTO baz (val) VALUES
(null),(null),(null),(null),(null),(null);

查询1:

SELECT  'foo'                   as table_name,
        'mixed null/non-null'   as description,
        21                      as expected_sum,
        COALESCE(SUM(val), 0)   as actual_sum
FROM    foo
UNION ALL

SELECT  'bar'                   as table_name,
        'all non-null'          as description,
        21                      as expected_sum,
        COALESCE(SUM(val), 0)   as actual_sum
FROM    bar
UNION ALL

SELECT  'baz'                   as table_name,
        'all null'              as description,
        0                       as expected_sum,
        COALESCE(SUM(val), 0)   as actual_sum
FROM    baz

结果:

| TABLE_NAME |         DESCRIPTION | EXPECTED_SUM | ACTUAL_SUM |
|------------|---------------------|--------------|------------|
|        foo | mixed null/non-null |           21 |         21 |
|        bar |        all non-null |           21 |         21 |
|        baz |            all null |            0 |          0 |

2
谢谢布拉德。那做得很好。
— 尼克,

1
从表GROUP BY中选择SELECT SUM(IFNULL(column,0))不是更正确吗?如果我们在“列”中有一些IS NULL值和一些实值怎么办?
— DarkSide 2013年

2
@DarkSide:绝对没有意外。
— 布拉德·克里斯蒂

@BradChristie是的,您绝对正确。SUM也可以使用NULL值。
— DarkSide 2014年

1
请注意,虽然SUM功能确实可以按预期运行,但在收到@DarkSide 提示您使用时AVG,COUNT可能会产生不同的结果,具体取决于您想要的结果。NULLCOALESCE
— fyrye

65

使用IFNULL或COALESCE:

SELECT IFNULL(SUM(Column1), 0) AS total FROM...

SELECT COALESCE(SUM(Column1), 0) AS total FROM...

它们之间的区别在于,它IFNULL是一个带有两个参数的MySQL扩展,并且COALESCE是一个可以带有一个或多个参数的标准SQL函数。当您只有两个参数时,使用IFNULL会稍微快一些,尽管此处的区别不明显,因为仅被调用一次。


3
@Mark什么是黑白 IFNULL或COALESCE?? 你能解释一下吗?
— mo sean 2014年

1
PS。对于使用Postgres的任何人,它仅支持coalesce。
— Siddhartha

4

无法确切地得到您所要的信息,但是如果您使用的是汇总SUM函数,这意味着您正在对表进行分组。

查询是这样的MYSQL

Select IFNULL(SUM(COLUMN1),0) as total from mytable group by condition

您按条件分组但不返回(您将得到很多未知条件)?
— Lluis Martinez
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.