1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

SQLを読んでいると、次のようなコードを見かけることがあります。

NVL(price, 0) > 0

最初に見たとき、

「NULLなら0になるのに、結局 0 > 0 は成立しないよね?」

と思いました。

この記事では、

  • NVLとは何か
  • なぜNULLを0に変換するのか
  • どんな場面で使われるのか

を初心者向けに解説します。

まず結論

NVL(値, 0) は、

値がNULLなら0に変換する

という処理です。

例えば、

NVL(price, 0)

の場合、

元の値 結果
1000 1000
0 0
NULL 0

になります。

実際にどう判定されるの?

次の条件を見てみます。

NVL(price, 0) > 0

これは

商品価格が0より大きいデータだけ取得する

という意味です。

パターン① 価格が1000円

NVL(1000, 0) > 0

1000 > 0

⭕ 条件に一致

パターン② 価格が0円

NVL(0, 0) > 0

0 > 0

❌ 条件に一致しない

パターン③ 価格がNULL

NVL(NULL, 0) > 0

0 > 0

❌ 条件に一致しない

なぜNULLを0に変換するの?

ここで疑問になります。

「NULLも不一致になるなら、最初から price > 0 でいいのでは?」

実はSQLのNULLは特殊な値です。

NULLは

値が存在しない

ことを表します。

そのため、

price > 0

という比較を行うと、

NULLに対する判定結果が分かりにくくなります。

そこで、

NVL(price, 0)

を使い、

一度0という数値に変換してから比較します。

これにより、

  • NULL
  • 0
  • 数値

を同じルールで判定できます。

初心者向けのイメージ

例えば入場チェックを考えてみます。

10以上なら入場OK

というルールがあった場合、

結果
20 入場OK
5 入場NG
空欄(NULL) 判定しづらい

そこで、

空欄なら0点扱い

というルールを追加します。

すると、

判定
20 OK
5 NG
NULL → 0 NG

となり、判定がシンプルになります。

NVLも同じ考え方です。

よく見る書き方

NVL(price, 0) > 0

NULLなら0として扱う

NVL(cancel_flag, 0) = 0

キャンセルされていないデータだけ取得する

NVL(quantity, 0)

NULLを0個として扱う

おわりに

最初は

NVL(price, 0) > 0

を見て、

「NULLを0にしているのに結局不合格になるの?」

と疑問に思うかもしれません。

しかし実際には、

NULLを安全に数値として扱うため

に使われています。

SQLではNULLが原因で意図しない結果になることがあるため、NVLは非常によく使われる関数の1つです。

SQLを読むときは、

「NULLだった場合にどう扱いたいのか?」

を意識すると理解しやすくなります。

※NULLという特殊な状態を、数値として安全に扱うための前処理なんだな。。。を学びました

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?