PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL mengatur bidang objek JSON dalam array JSON

Ini dimungkinkan dengan membuat ulang larik json pada setiap pembaruan.

SQL untuk pembuatan tabel dan contoh penyisipan data:

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

Data yang dimasukkan:

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

Perbarui kueri:

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;

Hasil kueri:

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

Kueri bekerja dengan cara berikut:

  1. Ubah array json menjadi baris json dan filter dengan game Properti. Ini dilakukan dengan membuat json_rows CTE.

  2. Perbarui data json di baris json tempat pengguna "Joe" ditemukan.

  3. Setelah Anda memiliki nilai json baru, lakukan pembaruan berdasarkan id.

Catatan: Seperti yang Anda lihat, dalam implementasi saat ini, array json dibuat ulang (hanya di baris yang perlu diperbarui). Ini dapat menyebabkan perubahan urutan elemen di dalam array.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL - buat kolom kenaikan otomatis untuk kunci non-primer

  2. dapatkan tabel GABUNG sebagai array hasil dengan PostgreSQL/NodeJS

  3. BUAT INDEKS UNIK JIKA TIDAK ADA di postgreSQL

  4. Bagaimana menghubungkan Struts 2 dengan Hibernate dan PostgreSQL

  5. SQL beberapa UNNEST dalam daftar pilih tunggal