以下是关于 Oracle 中处理空值的函数(NVL
、NVL2
、NULLIF
、COALESCE
等)详解,适用于 SQL 编程、数据分析和数据库应用开发场景。
📘 目录
- 空值(NULL)概述
NVL(expr1, expr2)
用法详解NVL2(expr1, expr2, expr3)
用法详解NULLIF(expr1, expr2)
用法详解COALESCE(expr1, expr2, ..., exprn)
用法详解- 对比分析与使用建议
- 实例汇总
- 常见误区与注意事项
- 小结与推荐实践
1. 空值(NULL)概述
在 Oracle 中:
NULL
表示“不存在”或“未知”的值。NULL ≠ 0
、NULL ≠ ''
,不能通过常规等号判断。任何与 NULL 的比较结果都是 NULL
(不为真也不为假)。
2. NVL(expr1, expr2)
用法详解
语法:
NVL(expr1, expr2)
功能: 如果 expr1
为 NULL
,则返回 expr2
,否则返回 expr1
。
示例:
SELECT NVL(commission_pct, 0) FROM employees;
若
commission_pct
为NULL
,则显示为 0。
注意事项:
expr1
和expr2
类型必须兼容,如都是数字、字符等。
3. NVL2(expr1, expr2, expr3)
用法详解
语法:
NVL2(expr1, expr2, expr3)
功能:
- 如果
expr1
不为NULL
,返回expr2
- 如果
expr1
为NULL
,返回expr3
示例:
SELECT NVL2(commission_pct, '有提成', '无提成') FROM employees;
根据
commission_pct
是否为空,返回不同的文字。
4. NULLIF(expr1, expr2)
用法详解
语法:
NULLIF(expr1, expr2)
功能:
- 如果
expr1 = expr2
,返回NULL
- 否则返回
expr1
典型用法:避免除零错误
SELECT salary / NULLIF(bonus, 0) FROM employees;
若
bonus=0
,结果为NULL
,避免除以0
报错。
5. COALESCE(expr1, expr2, ..., exprn)
用法详解
语法:
COALESCE(expr1, expr2, ..., exprn)
功能:
- 返回 第一个不为 NULL 的值
示例:
SELECT COALESCE(phone, mobile, email, '无联系方式') FROM users;
优先返回第一个非空联系方式。
与 NVL
区别:
NVL
只能处理两个值,COALESCE
可处理多个。
6. 对比分析与使用建议
函数 | 作用 | 用法简洁性 | 多参数处理 | 条件控制 |
---|---|---|---|---|
NVL | NULL替换 | 简单 | 否 | 否 |
NVL2 | 三元替换 | 中等 | 否 | 是 |
NULLIF | 判断相等返回NULL | 特殊 | 否 | 否 |
COALESCE | 多重优先返回 | 强大 | 是 | 是 |
7. 实例汇总
-- 示例1:NVL
SELECT NVL(manager_id, 0) FROM employees;
-- 示例2:NVL2
SELECT NVL2(commission_pct, salary * commission_pct, salary) FROM employees;
-- 示例3:NULLIF
SELECT NULLIF(department_id, 10) FROM departments;
-- 示例4:COALESCE
SELECT COALESCE(phone, email, 'N/A') AS contact FROM customers;
8. 常见误区与注意事项
NVL(x, y)
不是x OR y
,而是只在x IS NULL
时才用y
。- 使用
NVL
时,注意y
的类型兼容性,否则报错。 NULLIF(a, b)
不等于CASE WHEN a=b THEN NULL ELSE b END
。COALESCE
比NVL
更通用,建议用于多备选字段。
9. 小结与推荐实践
需求 | 推荐函数 |
---|---|
简单替代空值 | NVL |
判断空返回不同值 | NVL2 |
避免除0错误 | NULLIF |
多个字段优先返回第一个非空 | COALESCE |
发表回复