NVL与Coalesce之间的Oracle差异Oracle中的NVL和Coalesce之间是否存在明显差异?明显的区别在于coalesce将返回其参数列表中的第一个非null项,而nvl仅接受两个参数,如果不为null则返回第一个,否则返回第二个。似乎NVL可能只是一个'基础案例'版本的合并。我错过了什么吗?
3 回答
慕码人8056858
TA贡献1803条经验 获得超6个赞
COALESCE
是更现代的功能,是ANSI-92
标准的一部分。
NVL
在Oracle
具体的,它在推出80
的前存在任何标准。
在两个值的情况下,它们是同义词。
但是,它们的实现方式不同。
NVL
总是计算两个参数,同时COALESCE
通常在找到第一个非结束时停止评估NULL
(有一些例外,例如序列NEXTVAL
):
SELECT SUM(val)FROM ( SELECT NVL(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val FROM dual CONNECT BY level <= 10000 )
它运行了几0.5
秒钟,因为它生成了SYS_GUID()
,尽管1
不是NULL
。
SELECT SUM(val)FROM ( SELECT COALESCE(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val FROM dual CONNECT BY level <= 10000 )
这理解1
不是NULL
并且不评估第二个参数。
SYS_GUID
没有生成,查询是即时的。
白衣染霜花
TA贡献1796条经验 获得超10个赞
NVL将隐式转换为第一个参数的数据类型,因此以下内容不会出错
select nvl('a',sysdate) from dual;
COALESCE期望一致的数据类型。
select coalesce('a',sysdate) from dual;
会抛出'不一致的数据类型错误'
添加回答
举报
0/150
提交
取消