NOT NULL or NULL で置換、2つが同じ値なら NULL を戻す
NVL2 ( expr , ret_expr1 , ret_expr2 )
return [ 第一引数の型、NULL、または、優先順位の高い数値型 ]
expr ret_expr1 ret_expr2 | NULL を設定可能な式(数値式、文字列式、日付式、etc) |
- 式 expr が NULL 以外なら ret_expr1 の値
- 式 expr が NULL なら ret_expr2 の値
- SQL、埋め込みSQL で使用可能、PL/SQL に組み込まれていない。(Oracle 10g R2 時点)
NULLIF ( not_null_expr , expr ) 、
return [ 第一引数、NULL、または、優先順位の高い数値型 ]
not_null_expr | NULL を含まない式(数値式、文字列式、日付式、etc) |
expr | NULL を設定可能な式(数値式、文字列式、日付式、etc) |
- 2つの式が同じ値なら NULL 、異なるなら not_null_expr
NVL2 関数の内容
NULL を設定可能な式 expr が NULL 以外なら ret_expr1 を戻し、NULL なら ret_expr2を戻す。
数値型を使用した場合には優先順位の一番高い型に変換してから評価する。BINARY_DOUBLE > BINARY_FLOAT > NUMBER ⇒ 数値型の優先順位
内部で DECODE にでも変換されているのだろうか… PL/SQL には組み込まれていない。
NULLIF 関数の内容
第1引数の not_null_expr と第2引数の expr が同じ値なら NULL を戻す。異なる場合には not_null_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 関連