如果找不到值,如何在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 提示您使用时AVGCOUNT可能会产生不同的结果,具体取决于您想要的结果。NULLCOALESCE
fyrye

65

使用IFNULLCOALESCE

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

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

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


3
@Mark什么是黑白 IFNULLCOALESCE?? 你能解释一下吗?
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.