Postgresql 9.5にアップグレードできる場合は、jsonb_set
他の人が述べているように、コマンドが利用可能です。
以下の各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以上に変更すると、エラーが発生します 。これは、Postgres9.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
の値 列は最終バージョンに置き換えられます。