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

jsonb_set()を使用して特定のjsonb配列値を更新する

    jsonb_array_elements() with ordinalityを使用して、検索された要素のインデックスを見つけることができます。 (注:ordinality json配列の最初のインデックスが0である間、1から始まります):

    select 
        pos- 1 as elem_index
    from 
        samples, 
        jsonb_array_elements(sample->'result') with ordinality arr(elem, pos)
    where
        id = 26 and
        elem->>'8410' = 'FERR_R';
    
     elem_index 
    ------------
              2
    (1 row) 
    

    上記のクエリを使用して、インデックスに基づいて要素を更新します(jsonb_set()の2番目の引数に注意してください はテキスト配列です):

    update 
        samples
    set
        sample = 
            jsonb_set(
                sample,
                array['result', elem_index::text, 'ratingtext'],
                '"some individual text"'::jsonb,
                true)
    from (
        select 
            pos- 1 as elem_index
        from 
            samples, 
            jsonb_array_elements(sample->'result') with ordinality arr(elem, pos)
        where
            id = 26 and
            elem->>'8410' = 'FERR_R'
        ) sub
    where
        id = 26;    
    

    結果:

    select id, jsonb_pretty(sample)
    from samples;
    
     id |                   jsonb_pretty                   
    ----+--------------------------------------------------
     26 | {                                               +
        |     "result": [                                 +
        |         {                                       +
        |             "8410": "ABNDAT",                   +
        |             "8411": "Abnahmedatum"              +
        |         },                                      +
        |         {                                       +
        |             "8410": "ABNZIT",                   +
        |             "8411": "Abnahmezeit"               +
        |         },                                      +
        |         {                                       +
        |             "8410": "FERR_R",                   +
        |             "8411": "Ferritin",                 +
        |             "ratingtext": "Some individual text"+
        |         }                                       +
        |     ]                                           +
        | }
    (1 row)
    

    jsonb_set()の最後の引数 trueである必要があります キーがまだ存在しない場合に、新しい値を強制的に追加します。ただし、デフォルト値はtrueであるため、スキップできます。 。

    同時実行の問題は起こりそうにないようですが(WHERE条件が制限され、影響を受ける行の数が少ない可能性があるため)、PostgresのAtomic UPDATE..SELECTにも関心があるかもしれません。




    1. OracleDatabaseClientを段階的にインストールする

    2. ExcelファイルをMySQLデータベースにインポートする方法

    3. エラー:DockerのAlpineにpsycopg2をインストールするときにpg_config実行可能ファイルが見つかりません

    4. Oracleの一時データのパフォーマンスに関する考慮事項