猿问

NVL与Coalesce之间的Oracle差异

NVL与Coalesce之间的Oracle差异

Oracle中的NVL和Coalesce之间是否存在明显差异?

明显的区别在于coalesce将返回其参数列表中的第一个非null项,而nvl仅接受两个参数,如果不为null则返回第一个,否则返回第二个。

似乎NVL可能只是一个'基础案例'版本的合并。

我错过了什么吗?


开满天机
浏览 1222回答 3
3回答

慕码人8056858

COALESCE是更现代的功能,是ANSI-92标准的一部分。NVL在Oracle具体的,它在推出80的前存在任何标准。在两个值的情况下,它们是同义词。但是,它们的实现方式不同。NVL总是计算两个参数,同时COALESCE通常在找到第一个非结束时停止评估NULL(有一些例外,例如序列NEXTVAL):SELECT&nbsp;&nbsp;SUM(val)FROM&nbsp;&nbsp;&nbsp;&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;&nbsp;NVL(1,&nbsp;LENGTH(RAWTOHEX(SYS_GUID())))&nbsp;AS&nbsp;val&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;&nbsp;&nbsp;&nbsp;dual&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CONNECT&nbsp;BY &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;level&nbsp;<=&nbsp;10000 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)它运行了几0.5秒钟,因为它生成了SYS_GUID(),尽管1不是NULL。SELECT&nbsp;&nbsp;SUM(val)FROM&nbsp;&nbsp;&nbsp;&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;&nbsp;COALESCE(1,&nbsp;LENGTH(RAWTOHEX(SYS_GUID())))&nbsp;AS&nbsp;val&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;&nbsp;&nbsp;&nbsp;dual&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CONNECT&nbsp;BY &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;level&nbsp;<=&nbsp;10000 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)这理解1不是NULL并且不评估第二个参数。SYS_GUID没有生成,查询是即时的。

白衣染霜花

NVL将隐式转换为第一个参数的数据类型,因此以下内容不会出错select&nbsp;nvl('a',sysdate)&nbsp;from&nbsp;dual;COALESCE期望一致的数据类型。select&nbsp;coalesce('a',sysdate)&nbsp;from&nbsp;dual;会抛出'不一致的数据类型错误'
随时随地看视频慕课网APP
我要回答