说我在MySQL中有一个简单的功能:
SELECT SUM(Column 1) from Table WHERE Column 2='Test'
如果第2列中没有条目包含文本'Test',则此函数返回NULL,而我希望它返回0.
我知道在这里已经问了几次类似的问题,但是我无法根据我的目的调整答案,所以我很感激能帮助你做出这样的分类。
答案 0 :(得分:263)
使用COALESCE
来避免这种结果。
SELECT COALESCE(SUM(column),0)
FROM table
WHERE ...
要查看它的实际效果,请参阅此sql小提琴:http://www.sqlfiddle.com/#!2/d1542/3/0
更多信息:
给定三个表(一个包含所有数字,一个包含所有空值,一个包含混合):
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
<强> Results 强>:
| 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 |
答案 1 :(得分:58)
SELECT IFNULL(SUM(Column1), 0) AS total FROM...
SELECT COALESCE(SUM(Column1), 0) AS total FROM...
它们之间的区别在于IFNULL
是一个带有两个参数的MySQL扩展,COALESCE
是一个可以带一个或多个参数的标准SQL函数。当你只有两个使用IFNULL
的参数稍微快一些时,虽然这里差别很小,因为它只被调用一次。
答案 2 :(得分:3)
无法准确得到您的要求但是如果您使用的是聚合SUM函数,这意味着您正在对表格进行分组。
查询适用于MYSQL,如此
Select IFNULL(SUM(COLUMN1),0) as total from mytable group by condition
答案 3 :(得分:0)
如果列的总和为0,则显示为空
select if(sum(column)>0,sum(column),'')
from table