Why does NVL always evaluate 2nd parameter

nvl, oracle, sql

Solution

It's always been that way, so Oracle has to keep it that way to remain backwards compatible.

Use `COALESCE` instead to get the short-circuit behaviour.

Problem

Does anyone know, why Oracle's `NVL` (and `NVL2`) function always evaluate the second parameter, even if the first parameter is not `NULL`? Simple test: ``` 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` returns `0`, but also prints `Called`. `nvl_test` has been called, even though the result is ignored since first parameter is not `NULL`.

Original source