COALESCE最稳妥,是ANSI标准函数,支持所有主流数据库;它按顺序返回第一个非NULL值,参数个数不限,而IFNULL仅MySQL支持、ISNULL仅SQL Server支持。

直接结论:用 COALESCE 最稳妥,跨数据库兼容;IFNULL 只适用于 MySQL,ISNULL 仅限 SQL Server,别混用。
为什么字符串拼接一遇到 NULL 就整个变 NULL?
因为 SQL 中 NULL 表示“未知”,不是空字符串、不是零、不参与任何运算——'abc' + NULL 结果只能是 NULL,连类型都丢了。这不是 bug,是标准行为。
- 常见错误现象:
SELECT 'ID:' + id + ', name:' + name FROM users→ 只要id或name任一为NULL,整列返回NULL - 根本原因:加号(
+)在多数数据库里是算术/字符串连接操作符,不处理NULL传播 - 正确做法:先用
COALESCE把可能为NULL的字段兜底,再拼接 - 示例:
SELECT 'ID:' + COALESCE(CAST(id AS VARCHAR), '0') + ', name:' + COALESCE(name, '未知')
COALESCE 和 IFNULL 的关键区别在哪?
COALESCE 是 ANSI 标准函数,所有主流数据库(PostgreSQL、MySQL、SQL Server、Oracle)都支持;IFNULL 是 MySQL 独占,Oracle 用 NVL,SQL Server 用 ISNULL —— 换库就报错。
-
COALESCE(a, b, c):按顺序取第一个非NULL值,支持任意多个参数 -
IFNULL(a, b):只接受两个参数,MySQL 专属,a为NULL时返回b - 类型安全注意:
COALESCE返回值类型由参数中**最高优先级类型**决定(比如INT和VARCHAR混用,可能隐式转成字符串,但某些数据库会报错) - 性能无差异:两者都是轻量表达式计算,不触发额外扫描或索引查找
LEFT JOIN 后的 NULL 能不能直接用 COALESCE 替换?
可以替换显示值,但不能“修复”逻辑缺失——COALESCE(t2.status, 'no_match') 只是把右表没关联上的 NULL 显示成字符串,那行记录依然来自左表单边,别误以为它补出了真实数据。
- 典型陷阱:
WHERE COALESCE(t2.status, 'pending') = 'shipped'→ 实际过滤掉所有t2为NULL的行,LEFT JOIN 退化为 INNER JOIN - 正确写法:筛选条件必须进
ON子句,如ON a.id = b.order_id AND b.status = 'shipped';显示层再用COALESCE - 别在
GROUP BY或ORDER BY里依赖COALESCE后的值做分组依据,它不改变原始 NULL 语义 - PostgreSQL 和 MySQL 8.0+ 对
COALESCE内嵌子查询支持较好;SQLite 里慎用复杂嵌套,可能触发全表扫描
最容易被忽略的是类型一致性:COALESCE(price, 0) 在 price 是 DECIMAL 时没问题,但如果 price 是 VARCHAR,而你填了个数字 0,部分数据库会静默转成字符串,部分则直接报错。动手前先 SELECT pg_typeof()(PostgreSQL)或 SQL_VARIANT_PROPERTY(SQL Server)确认字段类型。










