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

syntax

NVL2 ( expr1 , expr2 , expr3 ) Oracle 9i
return [ 第一引数の型、NULL、または、優先順位の高い数値型 ]

parameter

exprNULL を設定可能な式(数値式、文字列式、日付式、etc)

return

  • expr1 が NULL 以外なら 式 expr2 の値(expr1 の型)
  • expr1 が NULL なら 式 expr3 の値(expr3 の型)

avail

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

syntax

NULLIF ( not_nullable_expr , expr ) 標準SQLOracle 9i
return [ 第一引数、NULL、または、優先順位の高い数値型 ]

parameter

not_nullable_exprNULL を含まない式(数値式、文字列式、日付式、etc)
exprNULL を設定可能な式(数値式、文字列式、日付式、etc)

return

  • 2つの式が同じ値なら NULL 、異なるなら not_nullable_expr

avail

  • SQL および PL/SQL の両方で使用可能。

NVL2 関数の内容 Oracle 9i

NULL を設定可能な式 expr1 が NULL 以外なら 式 expr2 を戻し、NULL なら 式 expr3を戻す。数値型にて使用した場合には優先順位の一番高い型に変換してから評価する。BINARY_DOUBLE > BINARY_FLOAT > NUMBER ⇒ 数値型の優先順位

内部で DECODE にでも変換されているのだろうか… PL/SQL には組み込まれていない。

NULLIF 関数の内容 標準SQL   Oracle 9i

第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 関連

 
アルファベット別 関数一覧 ショートカット
ABCDEFG
HILMNOP
RSTUVWX
日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)