好的 👍 我来详细讲解一下 SQL 语句中 NVL() 的用法


🔹 1. NVL() 基本概念

  • 适用数据库NVL() 是 Oracle 数据库 特有的函数(MySQL、SQL Server 没有原生 NVL,可以用 IFNULL()ISNULL() 或 COALESCE() 替代)。
  • 作用NVL(expr1, expr2),如果 expr1 为 NULL,则返回 expr2;否则返回 expr1
  • 返回类型:必须保证 expr1 和 expr2 的数据类型兼容(比如都为数值,或者都为字符串)。

🔹 2. 基本语法

NVL(expr1, expr2)

  • expr1:要检查的值(可能为 NULL)
  • expr2:替代值(当 expr1 为 NULL 时返回)

🔹 3. 示例讲解

✅ 示例 1:字符串处理

SELECT NVL(name, '未知姓名') AS user_name
FROM users;

👉 如果 name 列为 NULL,结果返回 '未知姓名';否则返回实际的 name


✅ 示例 2:数值处理

SELECT salary, NVL(bonus, 0) AS final_bonus
FROM employees;

👉 如果 bonus 为 NULL,则返回 0,保证计算时不会出错。


✅ 示例 3:表达式中使用

SELECT name, salary + NVL(bonus, 0) AS total_income
FROM employees;

👉 如果 bonus 为 NULL,则替换为 0,最终总收入不会出现 NULL


✅ 示例 4:嵌套使用

SELECT NVL(phone, NVL(email, '无联系方式')) AS contact
FROM customers;

👉 如果 phone 为 NULL,则检查 email;如果也为 NULL,则返回 '无联系方式'


🔹 4. 对比其他数据库的类似函数

不同数据库有不同的空值处理函数:

数据库语法示例
OracleNVL(expr1, expr2)NVL(bonus, 0)
MySQLIFNULL(expr1, expr2)IFNULL(bonus, 0)
SQL ServerISNULL(expr1, expr2)ISNULL(bonus, 0)
标准SQLCOALESCE(expr1, expr2, ...)COALESCE(bonus, 0)

🔹 5. 注意事项

  1. expr1 和 expr2 类型必须兼容,否则会报错。NVL(salary, '未知') -- ❌ 错误(salary 是数值,'未知' 是字符串) 正确写法:NVL(TO_CHAR(salary), '未知')
  2. NVL() 只能判断 NULL不会处理空字符串(在 Oracle 中 '' 会被当成 NULL,但在 MySQL 不一样)。

好的 👍 我来帮你整理一份 NVL() 与各数据库空值处理函数的对照速查表,这样你在 Oracle、MySQL、SQL Server 等数据库开发时就能一目了然。


📌 SQL 空值处理函数对照表

数据库函数名称用法示例说明
OracleNVL(expr1, expr2)如果 expr1 为 NULL,返回 expr2,否则返回 expr1NVL(bonus, 0)Oracle 特有
MySQLIFNULL(expr1, expr2)与 Oracle NVL() 完全等价IFNULL(bonus, 0)只能处理 2 个参数
SQL ServerISNULL(expr1, expr2)与 Oracle NVL() 完全等价ISNULL(bonus, 0)只能处理 2 个参数
标准 SQLCOALESCE(expr1, expr2, ...)返回第一个非 NULL 的值COALESCE(bonus, 0)可处理多个参数

🔹 使用示例

1. Oracle

SELECT NVL(bonus, 0) AS bonus_fixed
FROM employees;

2. MySQL

SELECT IFNULL(bonus, 0) AS bonus_fixed
FROM employees;

3. SQL Server

SELECT ISNULL(bonus, 0) AS bonus_fixed
FROM employees;

4. 标准 SQL(跨数据库通用)

SELECT COALESCE(bonus, 0) AS bonus_fixed
FROM employees;


🔹 注意点

  1. NVLIFNULLISNULL 都是 只能处理两个参数
    COALESCE 可以处理多个参数:SELECT COALESCE(phone, email, '无联系方式') AS contact FROM customers; 👉 如果 phone 为 NULL,就检查 email,还为 NULL 则返回 '无联系方式'
  2. 在 Oracle 中,空字符串 '' 会被当成 NULL;而在 MySQL 和 SQL Server 中,空字符串 ≠ NULL。
  3. 推荐跨数据库项目时,优先使用 COALESCE(),因为它是 SQL 标准写法,移植性最好。