在SQL查询场景中,当使用聚合函数对数据做统计时,如果查询条件没有匹配到任何记录,聚合函数通常会返回NULL,这会影响后续的业务逻辑处理,比如数值计算、前端展示等。此时可以通过COALESCE函数给聚合结果赋予默认值,避免NULL带来的影响。

聚合函数返回NULL的常见场景
常见的聚合函数包括SUM、AVG、COUNT、MAX、MIN,当查询结果集为空时,这些函数的返回值表现如下:
- SUM:对空结果集求和,返回NULL
- AVG:对空结果集求平均值,返回NULL
- COUNT:对空结果集计数,返回0,这是聚合函数中少数不返回NULL的情况
- MAX、MIN:对空结果集求最大最小值,返回NULL
比如下面这个查询,统计用户表中年龄大于100岁的用户总积分,如果不存在这样的用户,sum_result就会是NULL:
-- 查询年龄大于100岁的用户总积分,无匹配数据时返回NULL SELECT SUM(score) AS sum_result FROM user_table WHERE age > 100;
COALESCE函数的基本用法
COALESCE是SQL标准中的函数,支持大部分关系型数据库,它的作用是接收多个参数,依次判断每个参数是否为NULL,返回第一个非NULL的参数值,如果所有参数都是NULL,则返回NULL。语法格式如下:
COALESCE(参数1, 参数2, ..., 参数N)
比如下面的示例,第一个参数是NULL,第二个参数是默认值100,最终返回100:
-- 返回第一个非NULL的值,此处返回100 SELECT COALESCE(NULL, 100) AS result;
结合COALESCE给聚合函数赋默认值
我们只需要把聚合函数的结果作为COALESCE的第一个参数,把期望的默认值作为第二个参数,就可以在聚合结果为NULL时返回默认值。
SUM函数场景示例
给空结果集的求和结果赋默认值0:
-- 无匹配数据时,sum_result返回0而不是NULL SELECT COALESCE(SUM(score), 0) AS sum_result FROM user_table WHERE age > 100;
AVG函数场景示例
给空结果集的平均值结果赋默认值0:
-- 无匹配数据时,avg_result返回0而不是NULL SELECT COALESCE(AVG(score), 0) AS avg_result FROM user_table WHERE age > 100;
MAX、MIN函数场景示例
给空结果集的最大最小值赋默认值:
-- 无匹配数据时,max_result返回-1,min_result返回-1
SELECT
COALESCE(MAX(score), -1) AS max_result,
COALESCE(MIN(score), -1) AS min_result
FROM user_table
WHERE age > 100;
不同数据库的适配说明
除了COALESCE,不同数据库也有自己的空值处理函数,用法和COALESCE类似:
- MySQL中可以使用IFNULL函数,语法为IFNULL(聚合结果, 默认值),仅支持两个参数
- Oracle中可以使用NVL函数,语法为NVL(聚合结果, 默认值),仅支持两个参数
- SQL Server中同样支持COALESCE,也提供ISNULL函数,语法为ISNULL(聚合结果, 默认值)
以MySQL的IFNULL为例,实现和上面SUM场景相同的效果:
-- MySQL中使用IFNULL实现相同效果 SELECT IFNULL(SUM(score), 0) AS sum_result FROM user_table WHERE age > 100;
注意事项
在使用这种方式时,需要注意默认值的类型要和聚合结果的类型匹配,比如SUM的结果是数值类型,默认值也应该是数值类型,避免出现类型转换错误。另外COUNT函数本身在空结果集时返回0,不需要额外处理,但如果业务中需要统一返回格式,也可以搭配COALESCE使用,不过通常没有这个必要。