postgresqlでupdate insert

ある条件に当てはまるデータが登録済みならupdate、なければinsertをしたい。
結論からいうとONCONFLICTを使えばよいです。

ONCONFLICT

ONCONFLICTが使えるのはPostgresql 9.5以上、
ONCONFLICTに指定する項目はUNIQUE制約である必要があります。

INSERT
INTO test_table(
    id
    , point
    , time
)
VALUES (
    '1'
    , 100
    , '2020/08/20 10:00:00.000'
)
    ON CONFLICT(id) DO UPDATE
SET
    point = 100;

CTE

ONCONFLICTが使えない場合は、CTEを使うことで同じことができます。

WITH new_values (id, point, time) as (
  values
     ('1', 100, '2020/08/20 10:00:00.000'::timestamp)
),
upd AS (UPDATE test_table SET point = 100
               WHERE id = '1' RETURNING *)
INSERT INTO test_table(id, point, time)
SELECT (id, point, time
FROM new_values WHERE not exists (SELECT id FROM upd where upd.id = new_values.id);

ただし、UNIQUE制約がついてないため、重複する可能性があります。
重複が許されないシステムの場合、ONCONFLICTが使えるようにテーブル設計変更をおすすめします。

参考