उदाहरण सेटअप:
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"
}
}
}$$);
पुनरावर्ती क्वेरी jsonb_each()
निष्पादित करती है किसी भी स्तर पर पाए जाने वाले प्रत्येक जेसन ऑब्जेक्ट के लिए। नए प्रमुख नामों में रूट से पूरा पथ होता है:
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)
यदि आप इस डेटा का एक सपाट दृश्य प्राप्त करना चाहते हैं तो आप फ़ंक्शन का उपयोग कर सकते हैं create_jsonb_flat_view()
इस उत्तर में वर्णित JSONB फ़ील्ड से समेकित कुंजी/मान जोड़े को समतल करें?
आपको चपटे jsonb के साथ एक टेबल (या व्यू) बनाने की जरूरत है:
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()
अब आप टेबल पर फ़ंक्शन का उपयोग कर सकते हैं:
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)
समाधान Postgres 9.5+ में काम करता है, क्योंकि यह इस संस्करण में पेश किए गए jsonb फ़ंक्शन का उपयोग करता है। यदि आपका सर्वर संस्करण पुराना है, तो वैसे भी पोस्टग्रेज़ को अपग्रेड करने की अत्यधिक अनुशंसा की जाती है ताकि jsonb का कुशलतापूर्वक उपयोग किया जा सके।