條款三十八,如果 NVL 第二或第三個參數是 function 呼叫或是 select 語句,使用 CASE 取代 NVL2。

這是因為 NVL2 會先把每個可能的結果都先取出,儘管是根本不會出的結果,所以這樣會有不必要的 overhead。

SELECT NVL2(dummy, function_call(), function_call())
FROM dual;

建議的做法是用 CASE 取代 NVL2,以避開這樣的問題。

SELECT CASE
WHEN dummy IS NULL THEN function_call()
ELSE function_call()
END
FROM dual;