こんにちは、さるまりんです。
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の書き方です。
読んでくださってありがとうございました。
それではまた。