sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL sæt felt af JSON objekt i JSON array

Dette er muligt ved at genskabe json-arrayet på hver opdatering.

SQL til tabeloprettelse og eksempeldataindsættelse:

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 indsatte data:

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

Opdateringsforespørgsel:

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;
 

Resultater af forespørgslen:

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

Forespørgslen fungerer på følgende måde:

  1. Konverter json-arrayet til json-rækker og filtrer dem efter game ejendom. Dette gøres ved at oprette json_rows CTE.

  2. Opdater json-dataene i json-rækkerne, hvor brugeren "Joe" er fundet.

  3. Når du har de nye json-værdier, skal du bare lave en opdatering baseret på id'et.

Bemærk: Som du kan se, bliver json-arrayet genskabt i den aktuelle implementering (kun i de rækker, der skal opdateres). Dette kan forårsage en ændring i rækkefølgen af ​​elementerne inde i arrayet.




  1. SQL HVIS SELECT-forespørgslen er null, foretag en anden forespørgsel

  2. forslag til oprettelse af mysql-databasestruktur

  3. oci_connect forbindelse mislykkedes

  4. Django Admin-søgeforespørgsel rammer ikke Postgres-indekset