一尘不染

Oracle NVL和Coalesce之间的差异

sql

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

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

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

我想念什么吗?


阅读 319

收藏
2021-05-05

共1个答案

一尘不染

COALESCE是更现代的功能,是ANSI-92标准的一部分。

NVLOracle特定的,它80在没有任何标准之前于引入。

在两个值的情况下,它们是同义词。

但是,它们的实现方式有所不同。

NVL总是对两个参数求值,而COALESCE通常在找到第一个非参数时就停止求值NULL(有一些例外,例如sequence 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不会生成,查询是即时的。

2021-05-05