优先用 coalesce() 替代 is null 判断拼接,它按序返回首个非 null 值,支持多参数及跨数据库兼容;ifnull() 仅限 mysql 且仅两参数;where 中慎用 coalesce() 避免索引失效,数值字段兜底需注意类型精度。

直接用 COALESCE() 或 IFNULL(),别碰 IS NULL 判断后拼接,那不是替换,是绕路。
用 COALESCE() 统一处理多字段空值
它按顺序返回第一个非 NULL 的值,适合兼容多种数据库(PostgreSQL、SQLite 也支持),且能链式兜底:
- 如果
price是NULL,尝试用default_price;若后者也空,就用0 - 写成
COALESCE(price, default_price, 0),比嵌套IFNULL()清晰得多 - 注意:所有参数类型要尽量一致,否则 MySQL 可能隐式转换——比如
COALESCE(name, 999)会让name被转成数字,结果变0或警告
IFNULL() 仅限 MySQL,两参数够用但不扩展
这是 MySQL 特有函数,只接受两个参数,语义明确但灵活性低:
-
IFNULL(email, 'unknown@example.com')比COALESCE(email, 'unknown@example.com')少打几个字,仅此而已 - 不能写成
IFNULL(a, b, c)—— 会报错Incorrect parameter count in the call to native function 'IFNULL' - 性能上和
COALESCE()几乎无差别,别为“更快”选它
别在 WHERE 或 JOIN 条件里用 IS NULL 做“替换逻辑”
常见错误:想把 NULL 当成某个值参与匹配,于是写 WHERE COALESCE(status, 'active') = 'active' —— 这会跳过索引,全表扫描风险高。
- 真正该做的是:提前在业务层或写入时保证字段非空,或加生成列+索引,例如:
ALTER TABLE orders ADD COLUMN status_clean VARCHAR(20) STORED AS (COALESCE(status, 'active'));
- 如果必须查
NULL,直接用status IS NULL OR status = 'active',让优化器有机会用索引(取决于统计信息) -
COALESCE()在SELECT里安全,在WHERE里要小心是否破坏索引使用
最易被忽略的点:数值型字段用 COALESCE(col, 0) 看似稳妥,但如果 col 是 DECIMAL(10,2),而默认值写成 0(整型),MySQL 会把它转成 DECIMAL(10,0),可能影响后续计算精度。写成 0.00 更准确。











