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

Postgres JSONB đệ quy

Tôi đã sử dụng bảng ví dụ này để làm cho truy vấn dễ đọc hơn:

create table my_table(id serial primary key, jdata jsonb);
insert into my_table (jdata) values
('{
    "key1": {
        "key2": [
            {
                "key3": "test3",
                "key4": "test4"
            }
        ]
    },
    "key5": [
        {
            "key6":
            [
                {
                    "key7": "test7"
                }
            ]
        }
    ]
}');

Bạn phải tham gia cả jsonb_each(value)jsonb_array_elements(value) có điều kiện, tùy thuộc vào loại giá trị value :

with recursive extract_all as
(
    select 
        key as path, 
        value
    from my_table
    cross join lateral jsonb_each(jdata)
union all
    select
        path || '.' || coalesce(obj_key, (arr_key- 1)::text),
        coalesce(obj_value, arr_value)
    from extract_all
    left join lateral 
        jsonb_each(case jsonb_typeof(value) when 'object' then value end) 
        as o(obj_key, obj_value) 
        on jsonb_typeof(value) = 'object'
    left join lateral 
        jsonb_array_elements(case jsonb_typeof(value) when 'array' then value end) 
        with ordinality as a(arr_value, arr_key)
        on jsonb_typeof(value) = 'array'
    where obj_key is not null or arr_key is not null
)
select *
from extract_all;

Đầu ra:

        path        |                     value                      
--------------------+------------------------------------------------
 key1               | {"key2": [{"key3": "test3", "key4": "test4"}]}
 key5               | [{"key6": [{"key7": "test7"}]}]
 key1.key2          | [{"key3": "test3", "key4": "test4"}]
 key5.0             | {"key6": [{"key7": "test7"}]}
 key1.key2.0        | {"key3": "test3", "key4": "test4"}
 key5.0.key6        | [{"key7": "test7"}]
 key1.key2.0.key3   | "test3"
 key1.key2.0.key4   | "test4"
 key5.0.key6.0      | {"key7": "test7"}
 key5.0.key6.0.key7 | "test7"
(10 rows)

Các phần tử của mảng json không có khóa, chúng ta nên sử dụng các chỉ mục của chúng để xây dựng đường dẫn. Do đó, hàm jsonb_array_elements() nên được gọi với thứ tự. Theo tài liệu (xem 7.2.1.4. Chức năng của Bảng ):

Lệnh gọi hàm

jsonb_array_elements(case jsonb_typeof(value) when 'array' then value end) 
with ordinality as a(arr_value, arr_key)

trả về các cặp (value, ordinality) bí danh là (arr_value, arr_key) .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cách di chuyển bảng từ công khai sang giản đồ khác trong Postgres

  2. Sử dụng truy vấn Hibernate:dấu hai chấm được coi là tham số / dấu hai chấm thoát

  3. Tổng hợp các nhóm nút / cạnh được kết nối

  4. Cách bật TimescaleDB trên cơ sở dữ liệu PostgreSQL hiện có

  5. Thử nghiệm dưa chuột và RSpec với zeus:Postgres đang được người dùng khác truy cập