有谁知道,为什么Oracle的NVL(和NVL2)函数总是对第二个参数求值,即使第一个参数不是NULL呢?
NVL
NVL2
NULL
简单测试:
CREATE FUNCTION nvl_test RETURN NUMBER AS BEGIN dbms_output.put_line('Called'); RETURN 1; END nvl_test;
SELECT NVL( 0, nvl_test ) FROM dual
返回0,但也打印Called。
0
Called
nvl_test已调用,即使由于第一个参数不是,结果也被忽略了NULL。
nvl_test
一直都是这种方式,因此Oracle必须保持这种方式以保持向后兼容。
使用COALESCE,而不是让短路行为。
COALESCE