PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Pole zestawu PostgreSQL obiektu JSON w tablicy JSON

Jest to możliwe poprzez odtworzenie tablicy json przy każdej aktualizacji.

SQL do tworzenia tabel i przykładowych wstawiania danych:

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

Wprowadzone dane:

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

Zaktualizuj zapytanie:

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;

Wyniki zapytania:

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

Zapytanie działa w następujący sposób:

  1. Konwertuj tablicę json na wiersze json i filtruj je według game własność. Odbywa się to poprzez utworzenie json_rows CTE.

  2. Zaktualizuj dane json w wierszach json, w których znajduje się użytkownik „Joe”.

  3. Po uzyskaniu nowych wartości json po prostu zaktualizuj na podstawie identyfikatora.

Uwaga: Jak widać, w obecnej implementacji tablica json zostaje odtworzona (tylko w wierszach, które wymagają aktualizacji). Może to spowodować zmianę kolejności elementów wewnątrz tablicy.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wyłączyć wszystkie optymalizacje PostgreSQL

  2. Postgresql:FATAL:rola nie istnieje

  3. Wybierz losowy wiersz z tabeli PostgreSQL z ważonymi prawdopodobieństwami wierszy

  4. Zwróć nazwę kolumny i odrębne wartości

  5. Czy projekt PHP, Python, PostgreSQL nadaje się do aplikacji biznesowej?