sql >> Database teknologi >  >> RDS >> PostgreSQL

Henter json-elementer med et specifikt nøglenavn fra en kompleks indlejret struktur i postgres

Denne rekursive funktion udtrækker alle attributter fra et komplekst jsonb-objekt:

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 $$;

Eksempel på brug:

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. MySQL-rangering i tilfælde af bånd

  2. Min SQL-fejl:Et forbindelsesforsøg mislykkedes, fordi den tilsluttede part ikke svarede korrekt

  3. Fejl(5,3):PLS-00103:Opstod symbolet BEGIN, da man forventede et af følgende:sprog

  4. PHP PDO kontrollere, om en tabel med et specifikt navn findes i mySQL-databasen