COALESCE总返回NULL是因为所有参数均为SQL意义上的NULL;它严格按顺序检查是否为NULL,空字符串、0等非NULL值均不触发替换,仅当全部参数为NULL时才返回NULL。

COALESCE 为什么总返回 NULL?
当你发现 COALESCE(a, b, c) 还是返回 NULL,大概率是因为所有参数都是 NULL——它只取第一个非 NULL 值,不是“非空字符串”或“非零数字”。SQL 中的 NULL 和空字符串 ''、数字 0 完全不同,三者互不等价。
常见误用场景:
- 把
COALESCE(name, '未知')用在name = ''的记录上 → 不生效,因为''不是NULL - 混用类型:
COALESCE(int_col, 'N/A')在强类型数据库(如 PostgreSQL)中会报错,需显式转换
怎么安全地处理空字符串 + NULL?
如果字段可能为 NULL 或 ''(比如用户输入未填),得先统一转成 NULL 再用 COALESCE。MySQL 和 PostgreSQL 都支持 NULLIF():
SELECT COALESCE(NULLIF(trim(name), ''), '匿名') FROM users;
说明:
-
trim(name)去首尾空格,避免纯空格被当有效值 -
NULLIF(x, y)在x = y时返回NULL,否则返回x;这里把空字符串变成NULL - 再套一层
COALESCE就能兜底
COALESCE 和 CASE WHEN 选哪个?
功能上完全等价,但 COALESCE 是标准 SQL,更简洁;CASE 更灵活,适合带条件判断的场景。
比如要区分 0 和 NULL:
-- COALESCE 无法做到(0 不是 NULL) SELECT COALESCE(score, -1) FROM exam; -- score=0 时仍返回 0 <p>-- 改用 CASE 才能捕获 0 SELECT CASE WHEN score IS NULL THEN -1 ELSE score END FROM exam;
注意:COALESCE 内部会做隐式类型转换(如把整数转为字符串),而 CASE 要求所有分支返回相同类型,否则报错。
性能和兼容性要注意什么?
COALESCE 是短路计算:从左到右,遇到第一个非 NULL 就停止评估,后面表达式不会执行。这点常被忽略:
- 如果写
COALESCE(col, slow_function()),且col大部分非空,slow_function()几乎不调用 - 但在 Oracle 中,某些旧版本对函数参数有预计算行为,需实测验证
- SQLite 支持
COALESCE,但不支持NULLIF,得改用CASE WHEN x = '' THEN NULL ELSE x END
跨数据库迁移时,别假设 COALESCE('a', 123) 在所有系统都返回字符串——PostgreSQL 会报错,MySQL 和 SQL Server 可能转成字符串,但类型推导规则不一致。

















