はじめに
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という特殊な状態を、数値として安全に扱うための前処理なんだな。。。を学びました