先日書いた PostgreSQL JSON の部分的更新 - Oboe吹きプログラマの黙示録
この方法では、ネストしたキーを指定して一部を更新することができない。
例)
{ "task": { "name": "A", "order" : 10, "limit" : "2023-12-09" } }
このようなJSONに対して、'task'->'name' の値だけを変更するには、jsonb_set 関数を使う。
jsonb_set( 対象, カンマ区切りのpath, 変更値, [boolean] )
テーブル jbooks のカラム jdata が上のJSONデータであった時、
UPDATE jbooks SET jdata = jsonb_set(jdata, '{task,name}', '"B"') WHERE id = 3
で 'task'->'name' の値だけを変更する。
path は、{ } で括り、key は、" ダブルクォーテーションで括る。ことに注意、
値が文字列の場合は、ダブルクォーテーションで括る。
jsonb_set の第3引数 boolean は、
true = キーが存在しなければ、あたらしく指定したキーで値を追加する。
false = キーが存在しなければ、無視する。
デフォルトは、true である。