coalesce按顺序返回第一个非null值,不处理空字符串或0;需确保参数类型兼容,避免隐式转换;多级兜底用coalesce,单值替换优先ifnull,复杂条件用case when;慎用于where/order by以防索引失效。

COALESCE 用对了才能真正兜住 NULL
它不是“万能空值替换函数”,而是按顺序返回第一个非 NULL 的值;一旦遇到 NULL 就跳过,全为 NULL 才返回 NULL。很多人误以为它会自动把空字符串、0 或 ' ' 当成 NULL 处理——不会。
- 所有参数必须类型兼容,否则 MySQL 会隐式转换(比如把数字转成字符串),可能引发意外截断或精度丢失
- 如果第一个参数是
NULL但第二个是''(空字符串),结果就是'',不是你期待的默认值 - 常见错误:写成
COALESCE(col, '')后发现字段显示为空,却以为“兜住了”,其实只是把NULL换成了空字符串,业务逻辑可能仍出错
和 IFNULL、CASE WHEN 比较时该选谁
IFNULL 只支持两个参数,语义更轻量;COALESCE 支持多个,适合链式 fallback 场景;CASE WHEN 最灵活但写法冗长。别为了“看起来高级”硬用 COALESCE。
- 只判断一个字段是否为空并给默认值:优先用
IFNULL(col, 'default'),性能略好,意图清晰 - 需要多级兜底(比如查用户昵称:先取
nike_name,没有就取user_name,再没有就用'游客'):用COALESCE(nike_name, user_name, '游客') - 涉及条件判断(如“只有 status=1 时才用 name,否则用 alias”):必须用
CASE WHEN,COALESCE做不到
在 WHERE 和 ORDER BY 里用 COALESCE 要小心
它会让索引失效——尤其是当对字段本身做 COALESCE(col, 'default') 再参与比较时,MySQL 无法使用 col 上的索引。
- 错误写法:
WHERE COALESCE(phone, '') != ''→ 全表扫描风险高 - 正确思路:改用
WHERE phone IS NOT NULL AND phone != '',能走索引 - 排序时慎用:
ORDER BY COALESCE(updated_at, created_at)会强制 filesort,大数据量下明显变慢
JSON 字段里 COALESCE 不起作用?那是你没解包
MySQL 的 JSON 类型字段存的是字符串,直接对 JSON 列用 COALESCE(json_col, '{}') 没意义——它只是在比 JSON 文本是否为 NULL,不是在解析内容。
- 想取 JSON 内某个 key 的值并兜底,得先用
JSON_EXTRACT或箭头操作符->,再套COALESCE - 示例:
COALESCE(json_col->>'$.name', '匿名'),注意->>返回去引号字符串,->返回带引号的 JSON 字符串 - 如果
json_col本身是NULL,那json_col->>'$.name'也是NULL,这时COALESCE才生效
EXPLAIN,别让 COALESCE 成为慢查询的隐形推手。











