sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL-veld van JSON-object in JSON-array

Dit is mogelijk door de json-array bij elke update opnieuw te maken.

SQL voor het maken van tabellen en het invoegen van voorbeeldgegevens:

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

De ingevoegde gegevens:

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

Vraag bijwerken:

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;

Resultaten van de zoekopdracht:

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

De query werkt op de volgende manier:

  1. Converteer de json-array naar json-rijen en filter ze op de game eigendom. Dit wordt gedaan door de json_rows . te maken CTE.

  2. Werk de json-gegevens bij in de json-rijen waar de gebruiker "Joe" wordt gevonden.

  3. Zodra je de nieuwe json-waarden hebt, voer je een update uit op basis van de id.

Opmerking: Zoals u kunt zien, wordt in de huidige implementatie de json-array opnieuw gemaakt (alleen in de rijen die moeten worden bijgewerkt). Dit kan een verandering in de volgorde van de elementen in de array veroorzaken.




  1. Gebruik groeperen door binnen subquery

  2. Hoe ontwerp je een datamodel dat omgaat met de huidige medewerkers en voorspelde medewerkers?

  3. Basisprincipes van SQL Server ALTER TABLE-instructie

  4. mysqli_result::gratis verhoging van het php-geheugengebruik