はじめに
PostgreSQLでデータを管理していると、NULL値の扱いが少し厄介なことが分かります。 例えば、ほとんどの式は、式のいずれかの要素がNULLである場合、NULL値を返します。 NULL値に関連するいくつかの困難を避けるにはどうしたらよいでしょうか。 この2部構成のシリーズの最初の記事では、PostgreSQLのCOALESCE関数を使用してNULL値を検査し、NULLの代わりに別の値を代入する方法について説明しました。
前提条件
この記事の例に沿って作業を進める前に、PostgreSQLがすでにマシンにインストールされていることを確認しておいてください。
COALESCE in psql command-line interface
前回の記事では、PostgreSQL の psql
コマンドラインインターフェースにアクセスする方法について説明しました。 COALESCE の例をいくつか試すために、もう一度 psql
コマンドラインコンソールに入る必要があります。
以下に示す簡単な例から始めましょう。
1
|
この問い合わせの出力は、以下に示すものになるでしょう。
1
2 3 |
COALESCE
———- apple |
ご覧のように、引数リストの最初の非 NULL 値として ‘apple’ が出力として返されています。
リストの最初の項目として NULL 値がある場合、COALESCE
関数はそれをスキップして、NULL でない最初の値を探します。 これがどのように機能するかは、次のクエリで確認できます:
1
|
出力結果は、このようになります。
1
2 3 4 |
coalesce
———- となります。 apple (1 ROW) |
Use PostgreSQL COALESCE timestamp null
次の例では、次のようになります。 では、COALESCE
関数をタイムスタンプ・データ型で使ってみます。
まず、PostgreSQLで別のテーブルを作成する必要があります。
1
2 3 4 5 6 7 |
CREATE TABLE books(
book_id INT PRIMARY KEY NOT NULL.NULL) テーブルを作成し、このテーブルの値を変更します。 book_name VARCHAR NOT NULL, quantity INT, price REAL, year_released TIMESTAMP ); |
先ほど作成したbooks
テーブルにもレコードを挿入する必要があります。
1
2 3 4 5 6 7 |
INSERT INTO books(book_name, quantity, price, year_released)
VALUES (‘Book1’, 12, 60, ‘2015-07-21 09:10:25+8’), (‘Book2’, 5, 55, ‘2018-02-12 15:40:15+8’), (‘Book3’, 10, 90, ‘2017-11-12 00:10:11+8’), (‘Book4’, 26, 47, NULL), (‘Book5’, 2, 83, ‘2019-03-05 03:05:08+8’); |
データ型が timestamp
の year_released
列で、テーブルに NULL 値を挿入したことに注目してください。
各書籍の合計価格を取得したいと想像してみましょう。 その情報を得るために、2つの列の値を掛け合わせることにします。 quantity
と price
です。 以下のクエリは、これがどのように行われるかを示しています:
1
2 |
このクエリの出力は、次のように表示されます。
1
2 3 4 5 6 7 8 |
book_id | book_name | total_price
———+———–+————- 1 | Book1 | 720 2 | Book2 | 275 3 | Book3 | 900 4 | Book4 | 1222 5 | Book5 | 166 (5 ROWS) |
books
tableの内容をこの問い合わせで見ていきましょう。
1
|
SELECT * FROM books;
|
出力はこのような感じになるでしょうか?
1
2 3 4 5 6 7 8 |
book_id | book_name | quantity | price | year_released
– といった感じでしょうか?——–+———–+———–+———– 1|Book1|12|60|2015-07-21 09:10:25 2|Book2|5|55| 2018-02-12 15:40:15 3|Book3|10|90| 2017-11-12 00:10:11 4|Book4|26|47| 5|Book5|2|83| 2019-03-05 03:30頃。05:08 (5行) |
- 4 行目の最後の列に NULL 値があることに注意してください。 これを変更して、
COALESCE
関数を使用して非NULL値を代わりに使用することができます。
1
2 |
出力はこのようになるでしょうか。
1
2 3 4 5 6 7 8 |
book_id | book_name | COALESCE
———+———–+——————- 1 | Book1 | 2015-07-21 09:10:25-04 2 | Book2 | 2018-02-12 15:40:15-05 3 | Book3 | 2017-11-12 00:10:11-05 4 | Book4 | 2020-02-13 06:20:41.239926-05 5 | Book5 | 2019-03-05 03:05:08-05 (5 ROWS) |
結論
この2つの記事シリーズで、PostgreSQL COALESCE関数について深く見てきました。 この関数を使用して、データ内のNULL値を検査し、必要であればNULLでない値を代入する方法をいくつかの例で紹介しました。 これらの例を参考に、COALESCE
関数を自分のPostgreSQL文に取り入れる準備を整えてください。