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

meratakan jsonb bersarang secara rekursif di postgres tanpa kedalaman yang tidak diketahui dan bidang kunci yang tidak diketahui

Contoh penyiapan:

create table my_table(id int, data jsonb);
insert into my_table values
(1,
$${
   "type": "a type",
   "form": "a form",
   "contact": {
       "name": "a name",
       "phone": "123-456-78",
       "type": "contact type",
       "parent": {
           "id": "444",
           "type": "parent type" 
           } 
    }
}$$);

Kueri rekursif mengeksekusi jsonb_each() untuk setiap objek json yang ditemukan di level mana pun. Nama kunci baru berisi path lengkap dari root:

with recursive flat (id, key, value) as (
    select id, key, value
    from my_table,
    jsonb_each(data)
union
    select f.id, concat(f.key, '.', j.key), j.value
    from flat f,
    jsonb_each(f.value) j
    where jsonb_typeof(f.value) = 'object'
)
select id, jsonb_pretty(jsonb_object_agg(key, value)) as data
from flat
where jsonb_typeof(value) <> 'object'
group by id;

 id |                   data                   
----+------------------------------------------
  1 | {                                       +
    |     "form": "a form",                   +
    |     "type": "a type",                   +
    |     "contact.name": "a name",           +
    |     "contact.type": "contact type",     +
    |     "contact.phone": "123-456-78",      +
    |     "contact.parent.id": "444",         +
    |     "contact.parent.type": "parent type"+
    | }
(1 row)

Jika Anda ingin mendapatkan tampilan datar dari data ini, Anda dapat menggunakan fungsi create_jsonb_flat_view() dijelaskan dalam jawaban ini Meratakan agregat pasangan kunci/nilai dari bidang JSONB?

Anda perlu membuat tabel (atau tampilan) dengan jsonb yang diratakan:

create table my_table_flat as 
-- create view my_table_flat as 
with recursive flat (id, key, value) as (
-- etc as above
-- but without jsonb_pretty()

Sekarang Anda dapat menggunakan fungsi di atas meja:

select create_jsonb_flat_view('my_table_flat', 'id', 'data');

select * from my_table_flat_view;


 id | contact.name | contact.parent.id | contact.parent.type | contact.phone | contact.type |  form  |  type  
----+--------------+-------------------+---------------------+---------------+--------------+--------+--------
  1 | a name       | 444               | parent type         | 123-456-78    | contact type | a form | a type
(1 row)

Solusinya bekerja di Postgres 9.5+, karena menggunakan fungsi jsonb yang diperkenalkan dalam versi ini. Jika versi server Anda lebih lama, sangat disarankan untuk memutakhirkan Postgres untuk menggunakan jsonb secara efisien.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menyalin CSV ke database Postgresql yang dihosting Amazon RDS

  2. Gabungkan trigram dengan pencarian peringkat di Django 1.10

  3. psql - simpan hasil perintah ke file

  4. Pemicu PostgreSQL tidak mengembalikan apa pun

  5. Postgres COPY TO NULL integer