BigQuery でいつも使ってる MERGE を Postgres 12 でやろうとしたらなかったので代替策をメモ。
ON CONFLICT を使う。
BigQuery だとこうだけど:
1 2 3 4 5 6 7 8 | 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 だとこう書く:
1 2 3 4 5 | 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 文で入れる。