jsonb_set
他の人が述べたように、Postgresql 9.5にアップグレードできる場合は、コマンドを使用できます。
次の各SQLステートメントではwhere
、簡潔にするために節を省略しています。明らかに、あなたはそれを元に戻したいでしょう。
更新名:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
タグを置き換える(タグの追加または削除とは対照的に):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
2番目のタグ(0インデックス)の置き換え:
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データの単一のフィールドを更新しているわけではないことに注意することが重要です。代わりに、データの一時的な変更バージョンを作成し、その変更バージョンを列に割り当てます。実際には同じ結果になるはずですが、これを念頭に置いておくと、前の例のような複雑な更新がより理解しやすくなります。
複雑な例では、3つの変換と3つの一時バージョンがあります。最初に、最後のタグが削除されます。次に、新しいタグを追加することにより、そのバージョンが変換されます。次に、name
フィールドを変更することにより、2番目のバージョンが変換されます。data
列の値は最終バージョンに置き換えられます。