有谁知道,为什么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.
这是一个帖子,其中Tom Kyte证实了这个decode并且case短路但nvl没有给出理由或文件说明原因.只是声明它是:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:926029357278#14932880517348
因此,在您的情况下,您应该使用decode或case代替nvl在您的查询中调用昂贵的函数.
| 归档时间: |
|
| 查看次数: |
2248 次 |
| 最近记录: |