sql >> Database >  >> RDS >> PostgreSQL

Postgresql, waarde voor specifieke sleutel ophalen uit json-array

In Postgres 9.4+ gebruik de functie jsonb_array_elements() in een laterale verbinding:

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

U kunt het idee in een eenvoudige functie implementeren, bijvoorbeeld:

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;

In Postgres 12+ je hebt een leuk alternatief in de vorm van jsonb-padfuncties:

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

Db<>Fiddle.

Lees meer over JSON-functies en -operators.




  1. Dynamische kolommen naar rijen transponeren

  2. Waarom negeert Rails een Rollback in een (pseudo)geneste transactie?

  3. Vergelijking van MongoDB, MySQL en PostGreSQL

  4. Plaats gebeurtenis in het Windows-gebeurtenislogboek met Oracle