PostgreSQLで欠損値をNULLではなくデフォルト値に置き換える

データベースには、数値型、文字列型、日付型、論理値型など様々なデータ型がありますが、どんな種類のデータも NULL という値を取ることができます。

ただし、NULLはかなり厄介な存在で、NULLと文字列を結合するとNULLになり、NULLと数値の四則演算はNULLとなります。

つまり、NULLをそのままにして、計算を行うことはできません。

テストデータテーブルの作成

DROP TABLE IF EXISTS purchase_log_with_coupon;

CREATE TABLE purchase_log_with_coupon (purchase_id int, price int, coupon int);

INSERT INTO
  purchase_log_with_coupon (purchase_id, price, coupon)
VALUES
  (10001, 3600, NULL),
  (10002, 4280, 500),
  (10003, 3380, NULL);

COALESCE関数を使ってNULLを0に置き換える

SELECT
  purchase_id,
  price,
  coupon,
  price - coupon AS discount_price1,
  price - COALESCE(coupon, 0) AS discount_price2
FROM
  purchase_log_with_coupon;

price - coupon AS discount_price1とすると、null値との四則演算の結果discount_price1nullになってしまうが、COALESCE関数を使うとcouponnullの場合0に置き換えられるため、discount_price2ではcoupnnullであっても計算ができて、discount_price2がちゃんと計算できる。

 purchase_id | price | coupon | discount_price1 | discount_price2 
-------------+-------+--------+-----------------+-----------------
       10001 |  3600 |        |                 |            3600
       10002 |  4280 |    500 |            3780 |            3780
       10003 |  3380 |        |                 |            3380
(3 rows)

 

コメント