sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL nastavuje pole objektu JSON v poli JSON

To je možné tím, že při každé aktualizaci znovu vytvoříte pole json.

SQL pro vytváření tabulek a vkládání příkladů dat:

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"}]');

Vložená data:

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

Aktualizační dotaz:

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;

Výsledky dotazu:

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

Dotaz funguje následujícím způsobem:

  1. Převeďte pole json na řádky json a filtrujte je podle game vlastnictví. To se provede vytvořením json_rows CTE.

  2. Aktualizujte data json v řádcích json, kde se nachází uživatel „Joe“.

  3. Jakmile budete mít nové hodnoty json, proveďte aktualizaci na základě id.

Poznámka: Jak můžete vidět, v aktuální implementaci se pole json znovu vytvoří (pouze v řádcích, které je třeba aktualizovat). To může způsobit změnu v pořadí prvků uvnitř pole.




  1. Nejlepší způsob, jak zvládnout ukládání/zobrazování dat v různých časových pásmech v PHP?

  2. Nelze načíst soubor nebo sestavení „Chyba System.Data při nasazování aplikace na produkční databázi

  3. PIVOT s datovým typem varchar

  4. Jak přidáte ovladač PostgreSQL jako závislost v Maven?