はじめに

PostgreSQLでデータを管理していると、NULL値の扱いが少し厄介なことが分かります。 例えば、ほとんどの式は、式のいずれかの要素がNULLである場合、NULL値を返します。 NULL値に関連するいくつかの困難を避けるにはどうしたらよいでしょうか。 この2部構成のシリーズの最初の記事では、PostgreSQLのCOALESCE関数を使用してNULL値を検査し、NULLの代わりに別の値を代入する方法について説明しました。

前提条件

この記事の例に沿って作業を進める前に、PostgreSQLがすでにマシンにインストールされていることを確認しておいてください。

COALESCE in psql command-line interface

前回の記事では、PostgreSQL の psql コマンドラインインターフェースにアクセスする方法について説明しました。 COALESCE の例をいくつか試すために、もう一度 psql コマンドラインコンソールに入る必要があります。

以下に示す簡単な例から始めましょう。

SELECT COALESCE ( ‘apple’ , ‘pear’ , ‘strawberry’);

1

この問い合わせの出力は、以下に示すものになるでしょう。

1
2
3
COALESCE
———-
apple

ご覧のように、引数リストの最初の非 NULL 値として ‘apple’ が出力として返されています。

リストの最初の項目として NULL 値がある場合、COALESCE 関数はそれをスキップして、NULL でない最初の値を探します。 これがどのように機能するかは、次のクエリで確認できます:

SELECT COALESCE ( NULL, ‘apple’ , ‘pear’ , ‘strawberry’);

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’);

データ型が timestampyear_released 列で、テーブルに NULL 値を挿入したことに注目してください。

各書籍の合計価格を取得したいと想像してみましょう。 その情報を得るために、2つの列の値を掛け合わせることにします。 quantityprice です。 以下のクエリは、これがどのように行われるかを示しています:

SELECT book_id, book_name, ( quantity * price ) AS total_price
FROM books;

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値を代わりに使用することができます。

SELECT book_id, book_name,
COALESCE(year_released, CURRENT_TIMESTAMP) FROM books;

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文に取り入れる準備を整えてください。

コメントを残す

メールアドレスが公開されることはありません。