如果没有找到值,如何让 MySQL 中的 SUM 函数返回’0’?

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

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

如果 Column_2中没有包含文本‘ Test’的条目,那么这个函数返回 NULL,而我希望它返回0。

我知道类似的问题在这里已经被问过好几次了,但是我还没有能够根据我的目的来调整答案,所以我希望能够得到一些帮助来解决这个问题。

176935 次浏览

使用 IFNULLCOALESCE:

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


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

它们之间的区别在于,IFNULL是一个包含两个参数的 MySQL 扩展,而 COALESCE是一个可以包含一个或多个参数的标准 SQL 函数。如果只有两个参数,那么使用 IFNULL的速度会稍微快一些,不过这里的差别不大,因为它只调用一次。

使用 COALESCE可以避免这种结果。

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

要查看它的运行情况,请参见这个 sql 小提琴: http://www.sqlfiddle.com/#!2/d1542/3/0


更多信息:

给定三个表(一个包含所有数字,一个包含所有空值,一个包含混合) :

SQL Fiddle

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 |

不能准确地得到您所要求的内容,但是如果您使用聚合 SUM 函数,这意味着您正在对表进行分组。

查询对于 MYSQL 是这样的

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

如果列的和为0,则显示为空

select if(sum(column)>0,sum(column),'')
from table