PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mengambil elemen json dengan nama kunci tertentu dari struktur bersarang yang kompleks di postgres

Fungsi rekursif ini mengekstrak semua atribut dari objek jsonb yang kompleks:

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

Contoh penggunaan:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konversikan kolom byte ke OID sambil mempertahankan nilai

  2. Liquibase/PostgreSQL:bagaimana cara mempertahankan case tabel dengan benar?

  3. Bagaimana cara menyapu db:drop dan menyapu db:create di Heroku?

  4. Bagaimana cara menghasilkan beberapa deret waktu dalam satu kueri sql?

  5. Python unittest (menggunakan SQLAlchemy) tidak menulis/memperbarui basis data?