Oracle中的NVL和Coalesce之间没有明显的区别吗?

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

看来NVL可能只是合并的“基本案例”版本。

我想念什么吗?

最佳答案

COALESCEANSI-92标准的一部分,是一种更现代的功能。
NVLOracle特有的,它是在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/

10-10 05:00