1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PostgreSQL:NULLIF:2つの値が等しい場合にNULLを返す方法

1
Posted at

今回は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('', ''), '未登録')
  1. 内側のNULLIF('', '')は、2つの値が等しいためNULLを返します。
  2. 外側の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が返す値を順番に確認すると、式の意味を整理できます。

1
1
0

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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?