PostgreSQL の RETURNING の特殊な使い方

過去、以下2つを投稿しましたが、
PostgreSQL で mySQL の last_insert_id() 相当をmybatis で実装したい - Oboe吹きプログラマの黙示録

PostgresSQL アップサートのインクリメント - Oboe吹きプログラマの黙示録

そもそも、PostgreSQL の RETURNING は、INSERT 、UPDATE 、DELETE 実行した時
対象行を返す句を書くもの。
INSERT/UPDATE/DELETE が成立しなかった時は、SELECT結果が無いときと同じある。
以下のように使い方を整理できる。
INSERT ~ RETURNING ⇒ serial型カラムや、gen_random_uuid() で作成した UUID型のカラムを参照
UPDATE ~RETURNING ⇒ 更新行の更新後のカラムなどを参照
DELETE FROM ~RETURNING ⇒ 削除したレコードを参照

RETURNING は、SELECT句で書いていたことと同じものが書けるので、
極端に言えば、’*’ を書いて対象レコード全カラムを参照できる。

UPDATE tablename1 SET
work_status = 1
WHERE id > 12
RETURNING *

こう書ける。
更新対象のレコード全てを返すのだから、
 id > 12 のレコードの work_status を1にしたレコード全てを検索結果として返してくれる。
テーブルのカラム以外の関数もRETURNING句で書いたっていい。

UPDATE tablename1 SET
work_status = 1
WHERE id > 12
RETURNING id, name, CONCAT(name, '.xlsx') AS filename, NOW() AS ctime


UPDATE ~ WHERE ~ RETURNING は、処理したいレコードを
更新=マーキングして対象レコードをSELECT結果として求めるのに
有効な方法になる。