BigQuery でいつも使ってる MERGE を Postgres 12 でやろうとしたらなかったので代替策をメモ。
ON CONFLICT を使う。
BigQuery だとこうだけど:
MERGE my_tbl t1 USING my_tmp t2 ON t1.mykey = t2.mykey WHEN MATCHED THEN UPDATE SET hoge = t2.hoge, fuga = t2.fuga WHEN NOT MATCHED THEN INSERT(mykey, hoge, fuga) VALUES(mykey, hoge, fuga);
Postgres だとこう書く:
INSERT INTO my_tbl SELECT mykey, hoge, fuga FROM my_tmp ON CONFLICT (mykey) DO UPDATE SET hoge = excluded.hoge, fuga = excluded.fuga;
キーが重複した行の値が excluded という一時領域に退避されるので、それを update 文で入れる。