NULL 处理函数
SQL 提供了三个专门应对 NULL 的函数,从不同角度解决"遇到 NULL 怎么办"的问题。
IFNULL(expr, default)(MySQL 特有,标准 SQL 中叫 COALESCE):如果表达式是 NULL,返回默认值,否则返回表达式本身。最常用于计算列——比如奖金字段为 NULL 时按 0 算,确保算术运算不会变成 NULL。
COALESCE(expr1, expr2, ..., exprN):返回参数列表中第一个非 NULL 的值。可以接任意多个参数,比 IFNULL 更灵活。比如取联系电话时,COALESCE(mobile, office_phone, '无联系方式') 优先用手机,手机为空用座机,都没有就显示"无联系方式"。
NULLIF(expr1, expr2):如果两个值相等,返回 NULL;否则返回 expr1。常用来避免除零错误或把特定值统一标记为 NULL。
以飞翔科技为例:
-- IFNULL:奖金为 NULL 时按 0 算
SELECT
emp_name,
basic_salary,
IFNULL(performance_bonus, 0) AS 奖金,
basic_salary + IFNULL(performance_bonus, 0) AS 实发
FROM employees;
-- COALESCE:取第一个非空联系方式
SELECT
emp_name,
COALESCE(phone, email, '未登记') AS 联系方式
FROM employees;
-- NULLIF:避免除零(如果分母为 0,返回 NULL)
SELECT
dept_code,
SUM(performance_bonus) / NULLIF(SUM(basic_salary), 0) AS 奖金工资比
FROM employees
GROUP BY dept_code;
-- 组合使用:完整实发工资计算
SELECT
emp_name,
basic_salary,
COALESCE(performance_bonus, 0) AS bonus,
COALESCE(social_security, 0) + COALESCE(personal_tax, 0) AS 扣款合计,
basic_salary + COALESCE(performance_bonus, 0)
- COALESCE(social_security, 0) - COALESCE(personal_tax, 0) AS 实发工资
FROM employees
WHERE dept_code = 2;
COALESCE 的连锁查找特性在"多个备选字段中取最优值"的场景下非常实用。最后一个例子把所有可能为 NULL 的字段都用 COALESCE 兜底,确保计算输出干净的数字。