Oracle中的NVL和Coalesce之间没有明显的区别吗?
明显的区别在于,合并将返回其参数列表中的第一个非null项,而nvl仅接受两个参数,如果不为null则返回第一个,否则返回第二个。
看来NVL可能只是合并的“基本案例”版本。
我想念什么吗?
COALESCE是更现代的功能,是ANSI-92标准的一部分。
COALESCE
ANSI-92
NVL是Oracle特定的,它80在没有任何标准之前于引入。
NVL
Oracle
80
在两个值的情况下,它们是同义词。
但是,它们的实现方式有所不同。
NVL总是对两个参数求值,而COALESCE通常在找到第一个非参数时就停止求值NULL(有一些例外,例如sequence NEXTVAL):
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
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,并且不评估第二个参数。
1
SYS_GUID不会生成,查询是即时的。
SYS_GUID