一尘不染

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

mysql

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

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

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

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


阅读 415

收藏
2020-05-17

共1个答案

一尘不染

使用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 |
2020-05-17