sql >> データベース >  >> RDS >> PostgreSQL

postgresの複雑なネストされた構造から特定のキー名を持つjson要素を取得する

    この再帰関数は、複雑なjsonbオブジェクトからすべての属性を抽出します。

    create or replace function jsonb_extract_all(jsonb_data jsonb, curr_path text[] default '{}')
    returns table(path text[], value text)
    language plpgsql as $$
    begin
        if jsonb_typeof(jsonb_data) = 'object' then
            return query 
                select (jsonb_extract_all(val, curr_path || key)).*
                from jsonb_each(jsonb_data) e(key, val);
        elseif jsonb_typeof(jsonb_data) = 'array' then
            return query 
                select (jsonb_extract_all(val, curr_path || ord::text)).*
                from jsonb_array_elements(jsonb_data) with ordinality e(val, ord);
        else
            return query
                select curr_path, jsonb_data::text;
        end if;
    end $$;
    

    使用例:

    with my_table(data) as (
    select
        '{
            "$type": "a",
            "other": "x",
            "nested_object": {"$type": "b"},
            "array_1": [{"other": "y"}, {"$type": "c"}],
            "array_2": [{"$type": "d"}, {"other": "z"}]
        }'::jsonb
    )
    
    select f.*
    from my_table
    cross join jsonb_extract_all(data) f
    where path[cardinality(path)] = '$type';
    
             path          | value 
    -----------------------+-------
     {$type}               | "a"
     {array_1,2,$type}     | "c"
     {array_2,1,$type}     | "d"
     {nested_object,$type} | "b"
    (4 rows)    
    


    1. ダミーのチートシートのアクセス2021

    2. MySQLクエリから返されたPHPの配列をループする

    3. MySQLのUNIQUEインデックスの最大サイズ

    4. PDO見積もり方法