SQLのNULLIFってなに?同じ値ならNULLにしてみよう

こんにちは、さるまりんです。

SQLを書いていると、

「この値とこの値が同じだったら、NULLにしたい」

ということがあります。

そんなときに使えるのが、NULLIF です。

今回は、この NULLIF を見てみます。

NULLIFってなに?

NULLIF は、2つの値を比べて、同じなら NULL を返すものです。

例えば、

SELECT NULLIF(10, 10);

この場合は、

NULL

が返ります。

10 と 10 が同じだからですね。

では、

SELECT NULLIF(10, 20);

ならどうでしょうか。

この場合は、

10

が返ります。

2つの値が違う場合は、最初に指定した値が返ります。

つまり、

NULLIF(値1, 値2)

は、次のような動きをします。

  • 値1と値2が等しいと判定されたら → NULL
  • それ以外は → 値1

例えば、NULLIF(10, NULL) は 10、NULLIF(NULL, 10) は NULL になります。

空文字をNULLにしてみる

例えば、こんな users テーブルがあるとします。

name        nickname
--------------------
Taro        taro
Hanako      ''
Jiro        jiro

ここでは、Hanakoの nickname に入っている空文字を、分かりやすく '' と表しています。引用符そのものが入っているわけではありません。

nickname が空文字だった場合に、NULL として扱いたいとします。

そんなときは、

SELECT
    name,
    NULLIF(nickname, '') AS nickname
FROM users;

と書けます。

nickname が空文字なら、取得結果の nickname は NULL になります。

name        nickname
--------------------
Taro        taro
Hanako      NULL
Jiro        jiro

上のデータだと、name がHanakoの行ですね。

この SELECT は取得結果を変えるだけで、テーブルに保存されている値を書き換えるわけではありません。

空文字と NULL を区別するデータベースでは、「空文字だったらNULLとして扱いたい」というときに便利です。

0除算を避けるときにも使えます

NULLIF は、0除算を避けるときにも使われることがあります。

例えば、

SELECT total / NULLIF(count, 0) AS result
FROM sample;

とすると、count が 0 の場合は、NULLIF(count, 0) が NULL になります。

では、数値を NULL で割ると、どうなるのでしょうか。

計算結果も NULL になります。

具体的な数値で見てみます。

SELECT 100 / NULLIF(0, 0) AS result;

NULLIF(0, 0) が NULL になるので、これは 100 / NULL という計算になり、結果は次のようになります。

NULL

NULL は 0 とは違い、値が不明であることや、値がないことを表します。割る相手の値が分からないので、計算結果も分からない、というイメージですね。

この書き方では、0で割る処理を避け、その行の計算結果を NULL にしています。結果が 0 になったり、行そのものが除外されたりするわけではありません。

一方、count が 0 でなければ、その値で割り算をします。

SELECT 100 / NULLIF(5, 0) AS result;

こちらの結果は 20 です。

計算できない場合に NULL を返したいときには、こういう使い方もあります。

まとめ

NULLIF は、

NULLIF(値1, 値2)

のように書いて、2つの値が等しいと判定されたら NULL を返します。それ以外は、最初の値を返します。

空文字を NULL にしたいときや、0除算を避けたいときなどにも使えます。

0除算を避ける例では、割る値が 0 のとき、計算結果が NULL になることも覚えておくとよさそうですね。

大きな機能ではないですが、知っているとちょっと便利なSQLの書き方です。

読んでくださってありがとうございました。

それではまた。