以下是关于 Oracle 中处理空值的函数(NVLNVL2NULLIFCOALESCE 等)详解,适用于 SQL 编程、数据分析和数据库应用开发场景。


📘 目录

  1. 空值(NULL)概述
  2. NVL(expr1, expr2) 用法详解
  3. NVL2(expr1, expr2, expr3) 用法详解
  4. NULLIF(expr1, expr2) 用法详解
  5. COALESCE(expr1, expr2, ..., exprn) 用法详解
  6. 对比分析与使用建议
  7. 实例汇总
  8. 常见误区与注意事项
  9. 小结与推荐实践

1. 空值(NULL)概述

在 Oracle 中:

  • NULL 表示“不存在”或“未知”的值。
  • NULL ≠ 0NULL ≠ '',不能通过常规等号判断。
  • 任何与 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. 对比分析与使用建议

函数作用用法简洁性多参数处理条件控制
NVLNULL替换简单
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