为什么NVL总是评估第二个参数

Pet*_*ang 8 sql oracle nvl

有谁知道,为什么Oracle的NVL(和NVL2)函数总是评估第二个参数,即使第一个参数不是NULL

简单测试:

CREATE FUNCTION nvl_test RETURN NUMBER AS
BEGIN
  dbms_output.put_line('Called');
  RETURN 1;
END nvl_test;
Run Code Online (Sandbox Code Playgroud)

SELECT NVL( 0, nvl_test ) FROM dual

返回0,但也打印Called.

nvl_test已被调用,即使结果被忽略,因为第一个参数不是NULL.

Jef*_*emp 8

它一直都是这样,因此Oracle必须保持这种方式以保持向后兼容.

使用COALESCE,而不是让短路行为.


Dou*_*ter 5

这是一个帖子,其中Tom Kyte证实了这个decode并且case短路但nvl没有给出理由或文件说明原因.只是声明它是:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:926029357278#14932880517348

因此,在您的情况下,您应该使用decodecase代替nvl在您的查询中调用昂贵的函数.