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

पुनरावर्ती JSONB पोस्टग्रेज

क्वेरी को और अधिक पठनीय बनाने के लिए मैंने इस उदाहरण तालिका का उपयोग किया है:

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

आपको jsonb_each(value) दोनों में शामिल होना होगा और jsonb_array_elements(value) सशर्त रूप से, 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;

आउटपुट:

        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)

जेसन सरणी के तत्वों में कोई कुंजी नहीं है, हमें पथ बनाने के लिए उनकी अनुक्रमणिका का उपयोग करना चाहिए। इसलिए फ़ंक्शन jsonb_array_elements() औपचारिकता के साथ बुलाया जाना चाहिए। प्रति दस्तावेज (देखें 7.2.1.4. तालिका कार्य ):

फंक्शन कॉल

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

युग्म लौटाता है (value, ordinality) (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. प्रदर्शन निगरानी और ऑडिटिंग PostgreSQL - शीर्ष संसाधन

  2. कैसे PostgreSQL का उपयोग कर तालिका नाम से स्तंभ विशेषताएँ क्वेरी प्राप्त करने के लिए?

  3. PostgreSQL - क्वार्ट्ज JDBC-JobStoreTX - getTriggersForJob - ArrayIndexOutOfBoundsException

  4. PostgreSQL डेटाबेस में सभी दृश्यों को कैसे सूचीबद्ध करें

  5. एक मॉडल में रिकॉर्ड की संख्या को सीमित करें, जिसका मूल्य प्रति उपयोगकर्ता हो सकता है