如果没有找到值,如何在MySQL中获取SUM函数以返回'0'?

Nic*_*ick 134 mysql null sum function

说我在MySQL中有一个简单的功能:

SELECT SUM(Column 1) from Table WHERE Column 2='Test'
Run Code Online (Sandbox Code Playgroud)

如果第2列中没有条目包含文本'Test',则此函数返回NULL,而我希望它返回0.

我知道在这里曾经问过几次类似的问题,但是我无法根据自己的目的调整答案,所以我很感激能帮助你做好准备.

Bra*_*tie 284

使用COALESCE以避免这种结果.

SELECT COALESCE(SUM(column),0)
FROM   table
WHERE  ...
Run Code Online (Sandbox Code Playgroud)

要看到它的实际效果,请看这个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);
Run Code Online (Sandbox Code Playgroud)

查询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
Run Code Online (Sandbox Code Playgroud)

结果:

| 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 |
Run Code Online (Sandbox Code Playgroud)

  • 谢谢Brad.这很好地完成了工作. (2认同)
  • SELECT SUM(IFNULL(column,0)) FROM table GROUP BY 不是更正确吗?如果“列”中有一些 IS NULL 值和一些实际值怎么办? (2认同)
  • @DarkSide:[绝对没有](http://www.sqlfiddle.com/#!2/ad735/1/0)出乎意料. (2认同)

Mar*_*ers 61

使用IFNULLCOALESCE:

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

SELECT COALESCE(SUM(Column1), 0) AS total FROM...
Run Code Online (Sandbox Code Playgroud)

它们之间的区别在于它IFNULL是一个带有两个参数的MySQL扩展,COALESCE是一个可以带一个或多个参数的标准SQL函数.当你只有两个参数使用IFNULL稍微快一点时,虽然这里的差别是微不足道的,因为它只被调用一次.

  • @Mark有什么区别b/w`IFNULL`或`COALESCE` ?? 你能解释一下吗? (2认同)

Sas*_*ant 5

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

查询是这样的 MYSQL

Select IFNULL(SUM(COLUMN1),0) as total from mytable group by condition
Run Code Online (Sandbox Code Playgroud)