8

jsonbそこで、PostgreSQLを試してみたいと思いました。私のテーブルには、extrasタイプjsonbという名前の列があります。

サンプルデータはextras次のようになります{"param1": 10, "param2": 15}

SQL ステートメントのみを使用して JSON を変更したいと思います。私はこのようなことをしたい:

ofが 12を超える場合、その値に 10 を追加してフィールドを更新param1します。extrasparam2extras

このような SQL ステートメントをどのように記述できますか? アプリケーションレイヤーでこれを簡単に実行できることはわかっていますが、処理する可能性のある行数が膨大になり、db-application-で時間を無駄にしたくないため、SQLレイヤー自体でこれを実行したいと思います-デシベル往復

4

2 に答える 2

1

このjsonb型は、ドキュメント全体を格納するためのものです。ドキュメントの一部を変更した場合は、列に新しい値を割り当てる必要があります。Postgres はしばらくの間古いバージョンを保持するため、これはコストのかかる操作です。

jsonbそれを念頭に置いて、列を更新しない方法の例を次に示します。

create table t1 (doc jsonb);

insert into t1 values 
    ('{"param1": 10, "param2": 15}'),
    ('{"param1": 10, "param2": 5}');

update  t1
set     doc = ('{"param1": ' ||
        ((doc->'param1')::text::int + 10)::text ||
        ', "param2": ' ||
        (doc->'param2')::text ||
        '}')::jsonb
where   (doc->'param2')::text::int > 12;

select * from t1;

これは以下を出力します:

            doc
------------------------------
 {"param1": 10, "param2": 5}
 {"param1": 20, "param2": 15}
(2 rows)
于 2015-05-06T14:13:17.103 に答える