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

postgresql - json बनाने के लिए क्वेरी

एक गतिशील समाधान के लिए कुछ काम की जरूरत होती है।

सबसे पहले, हमें टेक्स्ट ऐरे और मान को jsonb ऑब्जेक्ट में बदलने के लिए एक फ़ंक्शन की आवश्यकता होती है।

create or replace function keys_to_object(keys text[], val text)
returns jsonb language plpgsql as $$
declare
    i int;
    rslt jsonb = to_jsonb(val);
begin
    for i in select generate_subscripts(keys, 1, true) loop
        rslt := jsonb_build_object(keys[i], rslt);
    end loop;
    return rslt;
end $$;

select keys_to_object(array['key', 'subkey', 'subsub'], 'value');

              keys_to_object              
------------------------------------------
 {"key": {"subkey": {"subsub": "value"}}}
(1 row)

इसके बाद, jsonb ऑब्जेक्ट्स को मर्ज करने के लिए एक और फ़ंक्शन (देखें JSONB मानों को PostgreSQL में मर्ज करना )।

create or replace function jsonb_merge(a jsonb, b jsonb) 
returns jsonb language sql as $$ 
select 
    jsonb_object_agg(
        coalesce(ka, kb), 
        case 
            when va isnull then vb 
            when vb isnull then va 
            when jsonb_typeof(va) <> 'object' or jsonb_typeof(vb) <> 'object' then vb 
            else jsonb_merge(va, vb) end 
        ) 
    from jsonb_each(a) e1(ka, va) 
    full join jsonb_each(b) e2(kb, vb) on ka = kb 
$$;

select jsonb_merge('{"key": {"subkey1": "value1"}}', '{"key": {"subkey2": "value2"}}');

                     jsonb_merge                     
-----------------------------------------------------
 {"key": {"subkey1": "value1", "subkey2": "value2"}}
(1 row) 

अंत में, उपरोक्त फ़ंक्शन के आधार पर एक समुच्चय बनाते हैं,

create aggregate jsonb_merge_agg(jsonb)
(
    sfunc = jsonb_merge,
    stype = jsonb
);

और हम कर चुके हैं:

select jsonb_pretty(jsonb_merge_agg(keys_to_object(key, translate(value, '{}"', '[]'))))
from test_table;

                 jsonb_pretty                 
----------------------------------------------
 {                                           +
     "cogs": {                               +
         "props1": {                         +
             "id": "26",                     +
             "value": "100",                 +
             "dimensions": "[200, 300]"      +
         },                                  +
         "props2": {                         +
             "id": "27",                     +
             "value": "200",                 +
             "dimensions": "[700, 800]"      +
         },                                  +
         "display": "Giant Cog",             +
         "description": "some awesome cog"   +
     },                                      +
     "widgets": {                            +
         "props1": {                         +
             "id": "28",                     +
             "value": "100",                 +
             "dimensions": "[200, 300]"      +
         },                                  +
         "props2": {                         +
             "id": "29",                     +
             "value": "200",                 +
             "dimensions": "[900, 1000]"     +
         },                                  +
         "display": "Giant Widget",          +
         "description": "some awesome widget"+
     }                                       +
 }
(1 row)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ऑटोइनक्रिकमेंट, लेकिन कॉलम में मौजूदा मानों को छोड़ दें

  2. डॉट-सीमांकित संख्यात्मक अनुक्रमों का आदेश देना (उदा., संस्करण संख्याएं)

  3. पीजी -वी 0.17.1 . स्थापित करना

  4. PostgreSQL 8.4 में कॉलम डेटाटाइप को कैरेक्टर से न्यूमेरिक में कैसे बदलें?

  5. अजगर psycopg2 जाँच पंक्ति मौजूद है