PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

अज्ञात गहराई और अज्ञात कुंजी क्षेत्रों के बिना पोस्टग्रेज में एक नेस्टेड jsonb को पुनरावर्ती रूप से समतल करें

उदाहरण सेटअप:

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 का कुशलतापूर्वक उपयोग किया जा सके।




  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 में jsonb नेस्टेड सरणी से कुंजी मान जोड़ी निकालें

  2. psycopg2.ProgrammingError:सिंटैक्स त्रुटि \ पर या उसके पास

  3. क्या PLV8 अन्य सर्वरों पर http कॉल करने का समर्थन करता है?

  4. PostgreSQL INSERT को एनम की एक सरणी में शामिल करें

  5. to_sql + sqlalchemy + + postgresql इंजन से कॉपी करें?