今回はPostgreSQLのNULLを学びます。取得したデータの意味を整理します。
所要時間は15分ほどです。
それでは、さっそく始めていきましょう!
今日のテーマと到達目標
NULLは、値がないことを表します。ゼロや空文字列、文字列の「NULL」と区別できることが今回の目標です。
| 記述 | 意味 |
|---|---|
NULL |
値がないことを表す |
0 |
数値のゼロ |
'' |
長さ0の文字列 |
'NULL' |
NULLという4文字の文字列 |
NULLだけから、値が不明なのか、未入力なのか、その項目が該当しないのかを決めることはできません。データの定義や運用上のルールと合わせて読む必要があります。
施設データでNULLの表示を確認する
取得元はmobility.poisです。1行が1施設を表し、poi_idは施設ID、poi_nameは施設名、opened_dateは開業日、closed_dateは閉業日を表す列です。
次のSQLを実行しました。
SELECT poi_id, poi_name, opened_date, closed_date
FROM mobility.pois
ORDER BY poi_id
LIMIT 10;
実行画面では、施設IDが1から10までの10行が表示され、いずれもclosed_dateが[NULL]と表示されました。
これは今回表示した10行について確認できたことです。テーブル全体の閉業日がすべてNULLであると確認したわけではありません。また、閉業日のNULLだけで営業中と断定することもできません。
表示用の文字と保存された値を区別する
psqlでは、NULLを表示する際に使う文字を設定できます。
\pset null '[NULL]'
この設定は、NULLを画面上で見分けやすくするためのものです。保存された値を文字列の[NULL]へ書き換える操作ではありません。
今回の画面には[NULL]が表示されていました。「文字列が保存されているという意味か」という確認には、「そのような意味ではないです」と回答しました。
画面に見える文字と、データベースが扱っている値を区別することが大切です。
NULL・ゼロ・空文字列・文字列NULLを並べる
次に、4種類を同じ結果に並べて表示しました。
SELECT
NULL AS missing_value,
0 AS zero_value,
'' AS empty_text,
'NULL' AS text_value;
このSQLではテーブルを取得元にせず、直接記述した値などを表示しています。ASの後ろは、結果の列に付ける名前です。
実行結果は次の1行でした。
missing_value | zero_value | empty_text | text_value
---------------+------------+------------+-----------
[NULL] | 0 | | NULL
missing_valueにはNULLの表示設定である[NULL]が出ています。zero_valueには数値の0が出ています。empty_textは長さ0の文字列なので、表示する文字がありません。text_valueには文字列としてNULLの4文字が出ています。
引用符の有無を確認する
次の2つは別の意味です。
NULL
'NULL'
引用符のないNULLは値がないことを表します。一方、単一引用符で囲んだ'NULL'は文字列です。今回の結果では、表示設定のおかげで前者が[NULL]、後者がNULLと見分けられました。
また、空文字列は引用符の間に文字を入れず、''と書きます。スペースを入れた' 'は1文字の文字列なので、空文字列とも異なります。
確認問題と回答
「NULLと空文字列は同じものか」という確認に対して、「違うものです」と回答しました。
空文字列には長さ0の文字列という値があります。NULLは値がないことを表すため、同じものとして扱いません。数値の0も、値がない状態ではありません。
今回のSELECTは表示を確認する操作であり、施設データの更新は行っていません。
合格条件と学習記録
| 確認項目 | 確認できた内容 |
|---|---|
| 施設データのNULL表示を確認する | 先頭10行のclosed_dateに[NULL]を確認 |
| 表示設定と保存された値を区別する |
[NULL]という文字列の保存を意味しないと回答 |
| 4種類を並べて表示する | NULL・0・空文字列・文字列NULLをSELECTで確認 |
| NULLと空文字列を区別する | 「違うものです」と回答 |
まとめ
NULL、0、空文字列、文字列のNULLは、それぞれ異なります。画面の見た目だけで判断せず、SQLの記述と表示設定を合わせて確認します。
NULLの業務上の意味は、列の定義やデータのルールで確かめます。今回確認したのは、NULLの基本的な意味と、ほかの値との違いです。