COALESCE 和 IFNULL 怎么选
处理
NULL最常用的是
COALESCE和
IFNULL,但它们行为不同:前者是 SQL 标准函数,支持多个参数,返回第一个非
NULL值;后者是 MySQL 特有,只接受两个参数,效率略高但扩展性差。
实际写法差异明显:
SELECT COALESCE(col1, col2, 'default') FROM t;
SELECT IFNULL(col1, 'default') FROM t;如果可能有多个备选字段(比如优先用
email_work,没有再试
email_personal,最后兜底),必须用
COALESCE若只是简单兜底(
price为空就设为 0),
IFNULL更直观,且在老版本 MySQL(如 5.6)中兼容性更稳
COALESCE所有参数会强制转为最高优先级的数据类型,比如
COALESCE(1, 'abc')返回字符串
'1',容易引发隐式转换 bug
聚合函数遇到 NULL 会自动忽略吗
是的,
SUM、
AVG、
COUNT(不带
*)等聚合函数默认跳过
NULL,但这个“自动”常被误用。
COUNT(col)统计非
NULL行数,而
COUNT(*)统计所有行 —— 如果你本意是“记录总数”,却写了
COUNT(status),那
status为
NULL的行就被漏掉了
AVG(col)对全
NULL列返回
NULL,不是 0,下游应用若没判空,可能触发空指针或类型错误 想把
NULL当 0 参与计算?得先用
IFNULL(col, 0)包一层,不能依赖聚合函数“自动处理”
WHERE 条件里写 col = NULL 为什么查不到数据
这是新手高频翻车点:
= NULL永远返回
UNKNOWN,不是
TRUE或
FALSE,所以 WHERE 不会匹配任何行。 正确写法只有
col IS NULL或
col IS NOT NULL别用
!= NULL或
NULL—— 同样无效,SQL 标准规定所有与
NULL的比较都为未知 如果逻辑复杂(比如 “状态为 active 或者 status 字段为空”,即
status = 'active' OR status IS NULL),注意
OR会让索引失效,必要时拆成
UNION或加函数索引
自定义函数里怎么安全返回 NULL
MySQL 存储函数(
CREATE FUNCTION)中,若参数为
NULL,函数默认也返回
NULL—— 除非显式声明
DETERMINISTIC并手动处理,但这不是重点;关键是函数体内部如何应对输入
NULL。 不要假设入参非空,尤其来自用户输入或关联表字段时。开头加判断:
IF param IS NULL THEN RETURN NULL; END IF;避免在函数里拼接字符串时直接用
CONCAT(a, b):任一参数为
NULL,结果就是
NULL。改用
CONCAT_WS('', a, b) 或先 IFNULL(a, '')函数返回类型要和实际一致。比如声明
RETURNS INT,但内部有
RETURN NULL是合法的;但如果声明
RETURNS INT NOT NULL,则函数内不能返回
NULL,否则调用时报错
健壮性不在堆砌防御逻辑,而在每处与外部数据交汇的地方,明确回答:“这里会不会来
NULL?来了我认不认?认了怎么转?不认了怎么拦?” —— 尤其是 JOIN 后的字段、子查询结果、JSON_EXTRACT 返回值,这些地方的
NULL最隐蔽也最致命。
