回答

收藏

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

技术问答 技术问答 82 人阅读 | 0 人回复 | 2023-09-13

有谁知道,为什么Oracle的NVL(和NVL2)函数总是对第二个参数求值,即使第一个参数不是NULL呢?) K7 w. O, V; o7 w- V# z% Z
简单测试:
7 f4 j; @. t; b( nCREATE FUNCTION nvl_test RETURN NUMBER AS( i5 L( G3 F+ O/ f( k$ X
BEGIN, e1 _7 e$ A' ?, @
  dbms_output.put_line('Called');
0 ?: T5 ^$ A# ]$ z  RETURN 1;, N: o& U  {9 p" ?
END nvl_test;2 j* u+ `- Q2 ]  A+ I, T$ W" R: ]
SELECT NVL( 0, nvl_test ) FROM dual1 m7 W: a, ], y7 z1 B( t- m9 I
返回0,但也打印Called。! B' f9 Q( e3 Z. F' X- G4 L
nvl_test已调用,即使由于第一个参数不是,结果也被忽略了NULL。
% ]2 z( _5 H. I7 r# z' T                $ B$ E# {: k4 r+ ^
解决方案:0 Y2 {) n( A6 E8 O  ^
               
! a1 b. p" p' @  U- ^
3 B; j. D% b" v  _" }5 P) f
2 o2 @9 i. k# w- b                一直都是这种方式,因此Oracle必须保持这种方式以保持向后兼容。9 g2 y$ w' ?6 k
使用COALESCE,而不是让短路行为。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则