PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgresql, récupère la valeur d'une clé spécifique à partir du tableau json

Dans Postgres 9.4+ utilisez la fonction jsonb_array_elements() dans une jointure latérale :

select (elem->>'skillLevel')::int as skill_level
from my_table
cross join jsonb_array_elements(json_col) elem
where elem->>'skillId' = '1';

Vous pouvez implémenter l'idée dans une fonction simple, par exemple :

create or replace function extract_skill_level(json_data jsonb, id int)
returns integer language sql as $$
    select (elem->>'skillLevel')::int
    from jsonb_array_elements(json_data) elem
    where elem->>'skillId' = id::text
$$;

select extract_skill_level(json_col, 1) as skill_level
from my_table;

Dans Postgres 12+ vous avez une belle alternative sous la forme de fonctions de chemin jsonb :

select (
    jsonb_path_query(
        json_col, 
        '$[*] ? (@.skillId == "1")'
        )->'skillLevel'
    )::int as skill_level
from my_table;

Db<>Violon.

En savoir plus sur Fonctions et opérateurs JSON.