Oracle中的NVL和Coalesce之间没有明显的区别吗?
明显的区别在于,合并将返回其参数列表中的第一个非null项,而nvl仅接受两个参数,如果不为null则返回第一个,否则返回第二个。
看来NVL可能只是合并的“基本案例”版本。
我想念什么吗?
最佳答案
COALESCE
是ANSI-92
标准的一部分,是一种更现代的功能。NVL
是Oracle
特有的,它是在80
的任何标准之前引入的。
对于两个值,它们是同义词。
但是,它们的实现方式有所不同。NVL
总是对两个参数求值,而COALESCE
通常在找到第一个非NULL
时就停止求值(有一些异常(exception),例如序列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
,查询是即时的。关于sql - Oracle NVL和Coalesce之间的差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/950084/