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

JSON配列内のJSONオブジェクトのPostgreSQLセットフィールド

    これは、更新のたびにjson配列を再作成することで可能になります。

    テーブル作成とデータ挿入の例のためのSQL:

    CREATE TABLE test_table(
      id BIGSERIAL PRIMARY KEY ,
      game TEXT,
      players JSONB
    );
    
    INSERT INTO test_table(game, players)
        VALUES
          ('chess', '[{"name": "Joe", "role": "admin"}, {"name": "Mike", "role": "user"}]'),
          ('football', '[{"name": "Foo", "role": "user"}, {"name": "Bar", "role": "user"}]');
    

    挿入されたデータ:

    +----+----------+----------------------------------------------------------------------+
    | id |   game   |                               players                                |
    +----+----------+----------------------------------------------------------------------+
    |  1 | chess    | [{"name": "Joe", "role": "admin"}, {"name": "Mike", "role": "user"}] |
    |  2 | football | [{"name": "Foo", "role": "user"}, {"name": "Bar", "role": "user"}]   |
    +----+----------+----------------------------------------------------------------------+
    

    クエリの更新:

    WITH json_rows AS
    (SELECT id, jsonb_array_elements(players) as json_data FROM test_table
    WHERE game = 'chess'),
     updated_rows AS (
        SELECT
          id,
          array_to_json(array_agg(
          CASE WHEN json_data -> 'name' = '"Joe"'
            THEN jsonb_set(json_data, '{role}', '"user"')
          ELSE json_data END)) as updated_json
        FROM json_rows
        GROUP BY id
    )
    UPDATE test_table SET players = u.updated_json
    FROM updated_rows u
    WHERE test_table.id = u.id;
    

    クエリの結果:

    +----+----------+---------------------------------------------------------------------+
    | id |   game   |                               players                               |
    +----+----------+---------------------------------------------------------------------+
    |  2 | football | [{"name": "Foo", "role": "user"}, {"name": "Bar", "role": "user"}]  |
    |  1 | chess    | [{"name": "Joe", "role": "user"}, {"name": "Mike", "role": "user"}] |
    +----+----------+---------------------------------------------------------------------+
    

    クエリは次のように機能します。

    1. json配列をjson行に変換し、gameでフィルタリングします 財産。これは、json_rowsを作成することによって行われます。 CTE。

    2. ユーザー「Joe」が見つかったjson行のjsonデータを更新します。

    3. 新しいjson値を取得したら、IDに基づいて更新を行うだけです。

    注: ご覧のとおり、現在の実装では、json配列が再作成されます(更新が必要な行のみ)。これにより、配列内の要素の順序が変更される可能性があります。




    1. タイムゾーンNOTNULLのないデータ型タイムスタンプのpostgresにステートメントを挿入します。

    2. SELECTステートメントの列名として変数を使用する方法

    3. のインデックスがここでの並べ替えに使用されないのはなぜですか?

    4. 列のすべての行を新しい値に更新します