NVL 函数用法详解(Oracle)

张开发
2026/4/15 10:04:57 15 分钟阅读

分享文章

NVL 函数用法详解(Oracle)
NVL 函数NVL是Oracle 数据库中专用的空值处理函数用于将NULL替换为指定的默认值。它是最早出现的空值处理函数之一语法简洁。一、语法与参数sqlNVL(expr1, expr2)参数说明expr1需要检查是否为NULL的表达式可以是列、计算、子查询等expr2当expr1为NULL时返回的默认值返回值如果expr1不是 NULL返回expr1的值。如果expr1是 NULL返回expr2的值。要求expr1和expr2的数据类型必须兼容Oracle 会隐式转换。二、简单示例1. 基本用法SELECT NVL(NULL, 空值) FROM dual; -- 返回 空值 SELECT NVL(非空, 空值) FROM dual; -- 返回 非空 SELECT NVL(1, 0) FROM dual; -- 返回 1 SELECT NVL(NULL, 0) FROM dual; -- 返回 02. 处理表中的 NULL 列-- 假设 employees 表中 commission_pct 列允许为空 SELECT last_name, NVL(commission_pct, 0) AS commission_pct FROM employees; -- 如果 commission_pct 为 NULL则显示 03. 数字运算中避免 NULL 传播-- 错误如果 salary 或 bonus 任一为 NULL则结果为 NULL SELECT salary bonus FROM payroll; -- 正确将 NULL 视为 0 SELECT salary NVL(bonus, 0) FROM payroll;4. 字符串拼接时避免出现 NULL-- 错误如果 middle_name 为 NULL整个结果为 NULL SELECT first_name || || middle_name || || last_name FROM employees; -- 正确将 NULL 替换为空串 SELECT first_name || || NVL(middle_name, ) || || last_name FROM employees;三、常见应用场景场景示例查询显示默认值SELECT NVL(phone, 无电话) FROM contacts;避免除零错误SELECT amount / NVL(quantity, 1) FROM order_items;聚合函数中对 NULL 的处理SUM(NVL(sales, 0))– 但通常SUM会忽略 NULL直接写SUM(sales)也可以条件判断简化WHERE NVL(status, 未处理) 未处理外连接时替代缺失值SELECT NVL(t.amount, 0) FROM main m LEFT JOIN trans t ON ...四、与 COALESCE 的对比特性NVLCOALESCE数据库支持Oracle 专有其他数据库不支持ANSI SQL 标准所有主流数据库都支持参数个数固定2 个可以有2 个或更多参数返回类型两个参数类型必须兼容会智能选择类型短路求值会计算两个参数即使第一个不为 NULL短路求值从左到右找到第一个非 NULL 后停止示例COALESCE 的扩展用法-- 从多个字段中取第一个非空值 SELECT COALESCE(phone, mobile, office_phone, 无电话) FROM contacts; -- NVL 做不到这样需要嵌套 SELECT NVL(phone, NVL(mobile, NVL(office_phone, 无电话))) FROM contacts;性能注意NVL(expr1, expr2)会始终计算expr2即使expr1不为 NULL。如果expr2是一个开销很大的子查询这会浪费资源。而COALESCE(expr1, expr2)只在expr1为 NULL 时才计算expr2。建议在 Oracle 中如果只是简单替换固定值如 0、空串用NVL没问题如果expr2很复杂优先考虑COALESCE。五、与其他数据库的对应函数数据库对应函数示例OracleNVL(expr, default)NVL(col, 0)SQL ServerISNULL(expr, default)ISNULL(col, 0)MySQLIFNULL(expr, default)IFNULL(col, 0)PostgreSQL / SQLiteCOALESCE(expr, default)COALESCE(col, 0)所有数据库COALESCE(expr, default)COALESCE(col, 0)六、注意事项数据类型一致两个参数的数据类型应匹配否则 Oracle 会隐式转换可能导致错误或性能问题。-- 不推荐数字和字符串 SELECT NVL(salary, 无工资) FROM employees; -- 隐式转换可能出错NVL无法用于判断空字符串在 Oracle 中空字符串被视为NULL所以NVL(, 空)返回空。与NVL2的区别Oracle 还提供了NVL2(expr, not_null_value, null_value)它有三个参数当expr非 NULL 时返回第二个参数为 NULL 时返回第三个参数。SELECT NVL2(commission_pct, 有佣金, 无佣金) FROM employees;NULLIF是另一个相关函数NULLIF(expr1, expr2)当两者相等时返回 NULL否则返回 expr1。常用于避免除零。七、实战综合示例-- 计算员工实发工资基本工资 奖金NULL 视为 0 SELECT employee_id, salary, NVL(commission_pct, 0) AS commission, salary NVL(commission_pct, 0) * salary AS total_pay FROM employees; -- 查询联系人信息电话号码为空时显示未提供 SELECT name, NVL(phone, 未提供) AS phone, NVL(email, 未提供) AS email FROM contacts; -- 在聚合中使用 NVL 防止 NULL 影响计算 SELECT department_id, SUM(NVL(salary, 0)) AS total_salary FROM employees GROUP BY department_id;总结NVL是 Oracle 中简单、直观的空值替换函数。两个参数第一个为 NULL 时返回第二个否则返回第一个。注意它不短路会计算所有参数若第二个参数是复杂表达式建议改用COALESCE。跨数据库兼容性考虑推荐使用标准 SQL 的COALESCE但在纯 Oracle 环境中NVL因其简洁性仍被广泛使用。

更多文章