NOT NULL or NULL で置換、2つが同じ値なら NULL を戻す

NVL2 ( expr1 , expr2 , expr3 )
return [ 第一引数の型、NULL、または、優先順位の高い数値型 ]
| expr | NULL を設定可能な式(数値式、文字列式、日付式、etc) |
- 式 expr1 が NULL 以外なら 式 expr2 の値(expr1 の型)
- 式 expr1 が NULL なら 式 expr3 の値(expr3 の型)

- SQL、埋め込みSQL で使用可能、PL/SQL に組み込まれていない。(Oracle 10g R2 時点)

NULLIF ( not_nullable_expr , expr )
、
return [ 第一引数、NULL、または、優先順位の高い数値型 ]
| not_nullable_expr | NULL を含まない式(数値式、文字列式、日付式、etc) |
| expr | NULL を設定可能な式(数値式、文字列式、日付式、etc) |
- 2つの式が同じ値なら NULL 、異なるなら not_nullable_expr

NVL2 関数の内容 
NULL を設定可能な式 expr1 が NULL 以外なら 式 expr2 を戻し、NULL なら 式 expr3を戻す。数値型にて使用した場合には優先順位の一番高い型に変換してから評価する。BINARY_DOUBLE > BINARY_FLOAT > NUMBER ⇒ 数値型の優先順位
内部で DECODE にでも変換されているのだろうか… PL/SQL には組み込まれていない。
NULLIF 関数の内容

第1引数の not_nullable_expr と第2引数の expr が同じ値なら NULL を戻す。異なる場合には not_nullable_expr を戻す。
NVL2 使用例
SQL> set null '<NULL>'
SQL> select NVL2(null, null, null) null_nvl from dual;
NULL_NVL
--------------------
<NULL>
SQL> select NVL2(null, sysdate, date '2000-01-01') null_date from dual;
NULL_DATE
--------------------
2000-01-01 00:00:00
SQL> select NVL2(chr(0), 'not null', 'null string') null_chr from dual;
NULL_CHR
--------------------
not null
⇒ SQL*Plus の NULL 表示
NULLIF 使用例
SQL> select NULLIF(1,1d), NULLIF(1,2) from dual;
NULLIF(1,1D) NULLIF(1,2)
------------ -----------
<NULL> 1
SQL> select NULLIF('ABC', 'ABC ') from dual;
NULLIF
------
<NULL>
'ABC' と 'ABC ' が同じ値となる理由 ⇒ 空白埋め比較セマンティクス
SQL> select NULLIF(null, null) from dual;
*
行1でエラーが発生しました。:
ORA-00932: データ型が一致しません: -が予想されましたがCHARです。
行間で重複値を除くのに使用する例
select NULLIF(colname, lag(colname)) from tablename
関連:カラム・レコード単位で連続する値を省略・削除する
SQL 関数 - NVL2,NULLIF 関連