今回はPostgreSQLのNULLIFを使い、2つの値が等しい場合にNULLを返す方法を学びます。取得したデータの意味を整理します。
所要時間は15分ほどです。
それでは、さっそく始めていきましょう!
用語と到達目標
NULLは値がないことを表します。空文字列''は長さ0の文字列であり、数値の0も空文字列もNULLとは異なります。
NULLIFは、2つの引数を等値比較し、等しければNULLを、そうでなければ最初の引数を返すSQLの式です。引数とは、括弧の中に指定する値や式のことです。
NULLIF(値1, 値2)
今回は、数値と文字列で結果を確認し、前回のCOALESCEと組み合わせることが目標です。テーブルからの取得ではなく、直接記述した値を使って確認します。
演習①:数値で確認する
次のSQLを実行しました。
SELECT
NULLIF(100, 100) AS same_value,
NULLIF(50, 100) AS different_value,
NULLIF(0, 0) AS zero_value;
実行結果は次の1行でした。
| same_value | different_value | zero_value |
|---|---|---|
| [NULL] | 50 | [NULL] |
100と100は等しいので、最初の列はNULLです。50と100は等しくないので、次の列は最初の値の50です。0と0は等しいので、最後の列もNULLです。
ASの後ろは結果に付ける列名です。same_valueなどの名前が、NULLIFの動作を変更するわけではありません。
0そのものがNULLになるわけではない
確認問題では、NULLIF(0, 100)の結果を考え、「0」と回答しました。
0と100は等しくないため、結果は最初の値の0です。この回答は予想による確認であり、画像にある3つの式とは別のものです。
一方、実行したNULLIF(0, 0)は、2つの引数が等しいためNULLを返しました。0を渡せば必ずNULLになるわけではなく、何と等しいかを確認する必要があります。
NULLの表示について
今回の画像では、NULLが[NULL]と表示されていました。psqlでは次の設定で、NULLの表示に使う文字を指定できます。
\pset null '[NULL]'
画面の[NULL]はNULLを見分けるための表示です。NULLIFが文字列の[NULL]を返したという意味ではありません。
演習②:文字列で確認する
次に、空文字列と都市名を使いました。
SELECT
NULLIF('', '') AS empty_result,
NULLIF('Tokyo', '') AS text_result,
COALESCE(NULLIF('', ''), '未登録') AS display_label;
実行結果は次の1行でした。
| empty_result | text_result | display_label |
|---|---|---|
| [NULL] | Tokyo | 未登録 |
最初のNULLIF('', '')は、2つの空文字列が等しいためNULLを返します。空文字列自体がNULLなのではなく、NULLIFの判定によって結果がNULLになります。
次のNULLIF('Tokyo', '')は、文字列Tokyoと長さ0の文字列が異なるため、最初の文字列Tokyoを返します。
「NULLにならない理由は何か」という確認には、「比較している文字列が異なるから」と回答しました。今回比較しているのは、Tokyoという5文字の文字列と、長さ0の文字列です。
COALESCEと組み合わせる
COALESCEは、引数を左から順に確認し、最初のNULLではない値を返す式です。
今回の3番目の式を、内側から確認します。
COALESCE(NULLIF('', ''), '未登録')
- 内側の
NULLIF('', '')は、2つの値が等しいためNULLを返します。 - 外側のCOALESCEは、そのNULLの代わりに文字列の「未登録」を返します。
結果として、空文字列を直接表示する代わりに「未登録」と表示できました。
この「未登録」は、自分で指定した表示用の文字列です。値が空になった理由をSQLが調べたわけではありません。実際のデータで使うときは、そのラベルがデータの意味に合っているかを確認します。
NULLIFとCOALESCEの役割を区別する
| 式 | 今回の役割 |
|---|---|
| NULLIF | 指定した2つの値が等しい場合にNULLを返す |
| COALESCE | NULLではない値を選び、代わりの表示を作る |
どちらも結果として返す値を決める式です。今回のSELECTはその結果を表示するだけで、保存済みのデータを書き換えていません。
また、NULLIFの結果がNULLになっても、元の空文字列や数値がすべてNULLに置き換わるわけではありません。今回の式の結果と、保存された値は区別します。
合格条件と学習記録
| 確認項目 | 確認できた内容 |
|---|---|
| 等しい場合にNULLになることを確認する | 100同士・0同士の結果がNULL |
| 等しくない場合に最初の値を返すと理解する | 50と100では50、0と100の予想は0 |
| 文字列でも理由を説明できる | Tokyoと空文字列は異なるからと回答 |
| COALESCEとの組み合わせを実行する | 空文字列からNULLを経由して未登録と表示 |
2つのSQLを実行し、数値と文字列の両方でNULLIFの動作を確認できました。
まとめ
NULLIFは2つの値が等しい場合にNULLを返し、それ以外では最初の値を返します。空文字列をNULLとして扱いたい表示処理にも使えます。
さらにCOALESCEと組み合わせると、NULLになった結果に代わりの文字列を指定できます。内側のNULLIFが返す値と、外側のCOALESCEが返す値を順番に確認すると、式の意味を整理できます。