Oracle SQLのNULLIF関数とは?2つの引数が等しいとNULLを返す仕組みと使い方を解説

Oracle

Oracle SQLのNULLIF関数は、2つの値を比較し、条件に応じてNULLまたは第1引数を返す関数です。SQLを書き始めたばかりの段階では、NVLCOALESCEと混同しやすいですが、役割は異なります。

NULLIFの基本は非常にシンプルで、第1引数と第2引数が等しい場合はNULLを返し、等しくない場合は第1引数を返します。比較結果を使って特定の値だけNULLへ変換したい場合に便利です。

ここではOracle SQLにおけるNULLIFの構文、具体例、CASE式との関係、ゼロ除算対策での使い方、NULLを含む場合の注意点まで順番に解説します。

NULLIFは2つの引数が等しい場合にNULLを返す

Oracle SQLのNULLIFは、次の形で使用します。

NULLIF(expr1, expr2)

expr1expr2を比較し、両者が等しい場合にはNULLを返します。等しくない場合にはexpr1をそのまま返します。

例えばNULLIF(10, 10)では2つの値が等しいため、結果はNULLになります。一方、NULLIF(10, 20)では値が異なるため、結果は第1引数の10です。

NULLIFはCASE式に置き換えて考えると分かりやすい

NULLIFの動作は、CASE式に置き換えると理解しやすくなります。概念的には次のような処理です。

CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

例えばNULLIF(score, 0)なら、「scoreが0ならNULL、それ以外ならscoreを返す」という意味になります。

このようにNULLIFは、特定の値だけをNULLへ置き換える処理を短く書くための関数と考えると理解しやすいでしょう。

実際のSELECT文でNULLIFを確認する

Oracle SQLではDUAL表を使って簡単に動作を確認できます。

SELECT NULLIF(100, 100) AS result FROM dual;

このSQLでは100と100が等しいため、resultはNULLになります。

一方で、次のSQLでは値が異なります。

SELECT NULLIF(100, 200) AS result FROM dual;

この場合は第1引数である100が返されます。NULLIFでは第2引数が返されることはなく、「等しければNULL、異なれば第1引数」と覚えるのがポイントです。

文字列でもNULLIFを使える

NULLIFは数値だけでなく、比較可能な文字列にも使用できます。例えば次のように書けます。

SELECT NULLIF('A', 'A') AS result FROM dual;

2つの文字列が等しいため結果はNULLです。

一方、NULLIF('A', 'B')なら文字列が異なるため、第1引数の'A'が返されます。

例えばデータベース上で「未設定」を表す特定の文字列をNULLとして扱いたい場合に、NULLIFを利用できることがあります。

NULLIFはゼロ除算を避ける用途でもよく使われる

NULLIFの代表的な実用例として、0による除算を避ける書き方があります。例えば次の計算を考えます。

sales / quantity

もしquantityが0なら、0で割ることになりエラーが発生します。そこで分母を次のようにNULLIFで包みます。

sales / NULLIF(quantity, 0)

quantityが0ならNULLIF(quantity, 0)はNULLになります。そのため0で除算する代わりにNULLを使った演算となり、結果もNULLになります。

例えばquantityが5ならNULLIFは5を返すので通常通り計算され、0ならNULLへ変換される、という仕組みです。

NULLIFとNVLは役割が逆に近い

Oracle SQLではNULL関連の関数としてNVLもよく使われますが、NULLIFとは目的が異なります。

NULLIFは「特定の値をNULLにする」方向の処理です。一方、NVLは「NULLを別の値へ置き換える」ために使います。

関数 主な役割
NULLIF 2つの値が等しければNULLへ変換 NULLIF(score, 0)
NVL NULLなら別の値へ置換 NVL(score, 0)

例えばNULLIF(score, 0)はscoreが0ならNULLにしますが、NVL(score, 0)はscoreがNULLなら0にします。処理の向きが異なるため、混同しないようにすると理解しやすくなります。

NULLIFとCOALESCEの違い

COALESCEもNULLを扱う代表的なSQL関数ですが、こちらもNULLIFとは目的が違います。

COALESCEは複数の引数を左から順番に確認し、最初に見つかったNULLではない値を返します。

例えばCOALESCE(phone_mobile, phone_home, '未登録')のようにすると、携帯番号があればそれを返し、なければ自宅番号、それもNULLなら「未登録」を返すといった処理ができます。

対してNULLIFは2つの値を比較して、等しい場合にNULLを生成する関数です。つまり、NULLIFは「NULLを作る」、COALESCEは「NULLを避けて値を選ぶ」という違いがあります。

NULLを引数に含む場合はSQLのNULL比較に注意する

NULLIFを理解するときには、SQLにおけるNULLの扱いにも注意が必要です。SQLではNULLは通常の値ではなく、「値が存在しない・不明である」ことを表します。

そのため、一般的なSQLではNULL同士を=で比較してTRUEになるわけではありません。NULLを判定するときにはIS NULLを使用します。

NULLIFも内部的には値の比較に基づいて動作するため、単純に「NULLとNULLは同じ値だから必ず一致する」と考えないことが重要です。NULLを含む式を扱う場合は、期待する結果を実際のSELECT文で確認すると安全です。

第1引数にリテラルNULLは指定できない点にも注意

OracleのNULLIFでは、第1引数expr1にリテラルのNULLをそのまま指定する使い方には制約があります。NULLIFは第1引数を比較し、異なればその値を返す関数だからです。

実務では通常、列や式を第1引数として使います。例えばNULLIF(status, '0')NULLIF(quantity, 0)のような形です。

NULL自体を別の値へ置換したい目的なら、NULLIFではなくNVLやCOALESCE、CASE式を使うほうが適しています。

NULLIFを使う典型的な実務例

NULLIFは、特定の値が実質的に「値なし」を表しているデータを扱うときに便利です。

例えばdiscount_rate列で0を「割引率未設定」とみなしたい場合、NULLIF(discount_rate, 0)とすれば0だけをNULLへ変換できます。

また、空文字や特定コードを未設定値として扱う設計では、列値と特定値を比較してNULLに変換し、その後COALESCEなどと組み合わせることもあります。

例えば考え方として、COALESCE(NULLIF(code, 'NONE'), '未設定')のように、まず特定値をNULLへ変換し、そのNULLを表示用文字列へ置き換えるといった処理ができます。

NULLIFを使わずCASE式にしたほうがよい場合もある

比較条件が単純な「等しいかどうか」だけならNULLIFは簡潔で読みやすい関数です。しかし条件が複雑になる場合はCASE式のほうが適しています。

例えば「値が0以下ならNULL」「100以上なら100」「それ以外は元の値」といった条件はNULLIFだけでは表現できません。

この場合はCASE WHEN value <= 0 THEN NULL WHEN value >= 100 THEN 100 ELSE value ENDのようにCASE式を使います。

NULLIFは「AとBが等しければNULL」という非常に限定された処理だからこそ、該当する場面ではSQLを短く読みやすくできます。

NULLIFの覚え方

NULLIFという名前は「もし条件が合えばNULLにする」と考えると覚えやすくなります。

NULLIF(A, B)を見たら、まず「AとBが同じならNULL」と読みます。そして「違うならA」と続ければ、ほぼそのまま動作を説明できます。

具体的にはNULLIF(5, 5)はNULL、NULLIF(5, 3)は5です。この2例を覚えておくだけでも基本動作を思い出しやすくなります。

まとめ:Oracle SQLのNULLIFは等しければNULL、異なれば第1引数を返す

Oracle SQLのNULLIF関数は、2つの引数を比較し、等しい場合にはNULL、異なる場合には第1引数を返す関数です。

基本形はNULLIF(expr1, expr2)で、考え方としてはCASE WHEN expr1 = expr2 THEN NULL ELSE expr1 ENDに近い処理です。

特定の値をNULLへ変換したい場合や、amount / NULLIF(quantity, 0)のようにゼロ除算を避けたい場合に便利です。一方、NULLを別の値へ置き換えたい場合はNVLやCOALESCEを使います。

NULLIFを覚えるときは、「等しければNULL、違えば第1引数」というルールを押さえておけば、多くのSQLを読み解けるようになります。

コメント

タイトルとURLをコピーしました