sql >> データベース >  >> RDS >> PostgreSQL

Postgres9.4でJSONBタイプの列に対して更新操作を実行する方法

    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の値 列は最終バージョンに置き換えられます。



    1. SqlCommandを使用して、パラメーター化されたデータベース名でデータベースを作成するにはどうすればよいですか?

    2. MySQLのカンマ区切り文字列を一時テーブルに分割

    3. ORはSQLServerのCASEステートメントではサポートされていません

    4. トレースフラグ3226を使用してログバックアップログを抑制します