ifnull是mysql专属双参数函数,仅当expr1为null时返回expr2;coalesce是sql标准函数,支持多参数并返回首个非null值,且具跨库兼容性。

IFNULL 和 COALESCE 都能替换 NULL,但行为不等价:IFNULL 是 MySQL 专属双参数函数,COALESCE 是标准 SQL 多参数函数,且对 NULL 的判断逻辑更严格。
IFNULL 只接受两个参数,第二个参数在第一个为 NULL 时生效
它本质是 IFNULL(expr1, expr2) 的简写,仅当 expr1 严格等于 NULL(不是空字符串、不是 0、不是 FALSE)时,才返回 expr2。常见误用是拿它“过滤空字符串”,结果失败:
-
SELECT IFNULL('', 'default')→ 返回''(空字符串不是 NULL) -
SELECT IFNULL(NULL, 'missing')→ 返回'missing' - 不能写成
IFNULL(col, 'a', 'b')—— 会报错Incorrect parameter count
COALESCE 返回第一个非 NULL 的表达式,但类型推导可能出人意料
COALESCE(expr1, expr2, ..., exprN) 按顺序检查每个表达式,返回第一个非 NULL 值。但它会强制所有参数隐式转为“最高优先级类型”,这在混合数值和字符串时容易翻车:
-
SELECT COALESCE(1, 'abc')→ 返回1(数值优先级高于字符串) -
SELECT COALESCE('abc', 1)→ 返回'abc'(第一个非 NULL 就返回,不继续转换) -
SELECT COALESCE(NULL, 42, 'fallback')→ 返回42(整数) - 如果所有参数都是 NULL,结果就是 NULL,不会报错
实际业务中该选哪个?看场景和可移植性需求
若只跑 MySQL 且逻辑简单(比如补默认值),IFNULL 更短、更直白;若要跨数据库(PostgreSQL/SQL Server 都支持 COALESCE),或需要链式 fallback(如查主键→查备用ID→查用户名→最后给 'anonymous'),必须用 COALESCE:
- 替代
IFNULL(a, IFNULL(b, c))→ 直接写COALESCE(a, b, c) - 在
ORDER BY中安全处理 NULL:ORDER BY COALESCE(updated_at, created_at) DESC - 注意:MySQL 对
COALESCE所有参数做类型兼容检查,哪怕某个参数根本不会被用到,类型不匹配也会报错
真正容易被忽略的是:NULL 判断永远只基于 SQL 的三值逻辑,和 PHP/Python 里 “falsy” 值的判断完全无关。写条件前先确认字段真为 NULL,而不是空字符串或 0 —— 这个区分点,比函数选哪个还关键。











