Postgresql 9.5 にアップグレードできる場合はjsonb_set
、他の人が言及しているように、コマンドを使用できます。
where
以下の各 SQL ステートメントでは、簡潔にするために句を省略しました。明らかに、それを元に戻したいと思うでしょう。
更新名:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
タグを置き換えます (タグの追加または削除とは対照的に):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
2 番目のタグ (0-indexed) を置き換える:
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
タグを追加します (これはタグが 999 個未満である限り機能します。引数 999 を 1000 以上に変更するとエラーが発生します。これは Postgres 9.5.3 では当てはまらないようです。より大きなインデックスを使用できます)。 :
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
最後のタグを削除します。
UPDATE test SET data = data #- '{tags,-1}'
複雑な更新 (最後のタグを削除し、新しいタグを挿入し、名前を変更します):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
これらの各例では、実際には JSON データの 1 つのフィールドを更新していないことに注意してください。代わりに、データの一時的な変更されたバージョンを作成し、その変更されたバージョンを列に割り当てます。実際には、結果は同じになるはずですが、これを念頭に置いておくと、最後の例のように複雑な更新がより理解しやすくなります。
複雑な例では、3 つの変換と 3 つの一時的なバージョンがあります。まず、最後のタグが削除されます。次に、そのバージョンは、新しいタグを追加することによって変換されます。次に、name
フィールドを変更して 2 番目のバージョンを変換します。列の値data
は最終バージョンに置き換えられます。