coalesce函数返回参数中第一个非null值,适用于mysql和postgresql等标准sql数据库;语法为coalesce(val1, val2, ..., valn),要求参数类型兼容,常用于字段默认值替换,如coalesce(price, 0.00)或coalesce(name, '')。

COALESCE函数在MySQL和PostgreSQL中怎么用
COALESCE 是标准 SQL 函数,返回参数列表中第一个非 NULL 的值,适合跨数据库兼容场景。它接受任意数量参数,但所有参数类型需兼容(否则会触发隐式转换或报错)。
常见错误是传入类型不一致的字段,比如 COALESCE(name, 123) 在 PostgreSQL 中直接报错,MySQL 可能转成字符串但结果不可控。
- 推荐写法:
COALESCE(price, 0.00)(数值型字段补默认值) - 字符串补空串:
COALESCE(description, ''),注意不是'NULL'字符串 - 嵌套使用要谨慎:
COALESCE(COALESCE(a, b), c)等价于COALESCE(a, b, c),没必要多套一层
IFNULL只在MySQL里能用,别在其他数据库硬套
IFNULL 是 MySQL 特有函数,仅接受两个参数:第一个为待检查值,第二个为 NULL 时的替代值。它比 COALESCE 少一层类型推导逻辑,性能略高但完全不跨库。
典型误用是在 PostgreSQL 或 SQLite 里写 IFNULL(name, 'N/A'),直接报错 function ifnull does not exist。
- MySQL 安全写法:
IFNULL(updated_at, NOW()),注意第二个参数必须能被 MySQL 隐式转为目标列类型 - 不能用于条件分支逻辑,比如
IFNULL(status = 'active', false)是错的——IFNULL不处理布尔表达式结果,应改用CASE WHEN status = 'active' THEN true ELSE false END - 和
NULLIF别混淆:NULLIF(x, y)是当 x=y 时返回NULL,用途相反
WHERE子句里判NULL不能用等号,得用IS NULL
很多人写 WHERE column = NULL 查不到任何数据,因为 SQL 中 NULL = NULL 返回的是 UNKNOWN,不是 TRUE,所以整个条件不成立。
这是 NULL 处理最常踩的坑,和 COALESCE 或 IFNULL 无关,但经常一起出现——比如先用 COALESCE 补值,再在 WHERE 里错误地用等号判断原始字段是否为 NULL。
- 正确写法:
WHERE column IS NULL或WHERE column IS NOT NULL - 想查“值为空或为0”的记录,不要写
WHERE COALESCE(column, 0) = 0,效率低且可能误伤 0 值本身;应写WHERE column IS NULL OR column = 0 - 索引对
IS NULL有效,但对COALESCE(column, 0) = 0这类表达式通常无法走索引
ORDER BY里NULL默认排最前还是最后?得看数据库
不同数据库对 NULL 在排序中的位置约定不同:MySQL 和 SQL Server 默认把 NULL 排最前,PostgreSQL 默认排最后。这会影响你用 COALESCE “伪装”排序的行为是否符合预期。
例如 ORDER BY COALESCE(priority, 999) 在 PostgreSQL 里能让 NULL 值排到底部,但在 MySQL 里反而可能把它们顶到最上面(因为原生 NULL 已经在最前了)。
- 显式控制更可靠:
ORDER BY priority ASC NULLS LAST(PostgreSQL / Oracle 支持),MySQL 不支持该语法,只能靠COALESCE或IFNULL拉平 - MySQL 替代方案:
ORDER BY ISNULL(priority), priority,利用ISNULL()返回 0/1 控制 NULL 位置 - 如果业务要求 NULL 必须排最后,又需兼容多库,建议统一用
COALESCE(priority, 999999)并确保替代值足够大(避免和真实业务值冲突)










