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オブジェクトをマージする別の関数(PostgreSQLでのJSONB値のマージ を参照) 。

    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. 特定のフィールドに通貨記号£、$を追加します。ORACLE

    2. MySQL:行レベルのセキュリティ(Oracleの仮想プライベートデータベースなど)を実行するにはどうすればよいですか?

    3. 外部データラッパーを使用してSSLサポートがコンパイルされていない場合、PostgresSSLMode値は無効である必要があります

    4. Oracleの日付から短い月の名前を返す