PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

làm phẳng một cách đệ quy một jsonb lồng nhau trong các postgres mà không có độ sâu không xác định và các trường khóa không xác định

Thiết lập mẫu:

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

Truy vấn đệ quy thực thi jsonb_each() cho mọi đối tượng json được tìm thấy ở bất kỳ cấp độ nào. Các tên khóa mới chứa đầy đủ đường dẫn từ gốc:

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)

Nếu bạn muốn xem dữ liệu này một cách phẳng, bạn có thể sử dụng hàm create_jsonb_flat_view() được mô tả trong câu trả lời này Làm phẳng các cặp khóa / giá trị tổng hợp khỏi trường JSONB?

Bạn cần tạo một bảng (hoặc chế độ xem) với jsonb phẳng:

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()

Bây giờ bạn có thể sử dụng hàm trên bảng:

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)

Giải pháp hoạt động trong Postgres 9.5+, vì nó sử dụng hàm jsonb được giới thiệu trong phiên bản này. Nếu phiên bản máy chủ của bạn cũ hơn, bạn nên nâng cấp Postgres để sử dụng jsonb một cách hiệu quả.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Quá trình phân tích sonar mất nhiều thời gian

  2. Sử dụng CHÈN ... BẬT MÀ KHÔNG PHẢI TRỞ LẠI các hàng không thành công

  3. API tiêu chí JPA:cách truy xuất ngày ở định dạng mm / dd / yyyy

  4. sử dụng id trả về từ insert into, để chèn bản ghi bằng khóa ngoại

  5. Cách cập nhật các hàng trong Cơ sở dữ liệu với các giá trị từ data.frame trong R theo điều kiện