Postgresql,从json数组中检索特定键的值

Ali*_*nik 4 sql postgresql jsonb

我有Postgres JSONB对象数组,看起来像这样:

'[
  {
    "skillId": "1",
    "skillLevel": 42
  },
  {
    "skillId": "2",
    "skillLevel": 41
  }
]'
Run Code Online (Sandbox Code Playgroud)

这个JSONB是一个函数参数.

什么是检索最有效的方式skillLevel进行 skillId = "1".

我试过玩,jsonb_array_elements但到目前为止我所做的一切看起来都非常混乱.

kli*_*lin 7

with my_table(data) as (
values
('[
  {
    "skillId": "1",
    "skillLevel": 42
  },
  {
    "skillId": "2",
    "skillLevel": 41
  }
]'::jsonb)
)

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

 skill_level 
-------------
 42
(1 row) 
Run Code Online (Sandbox Code Playgroud)

以上似乎是最简单的方法,你可以在一个函数中使用这个想法,例如:

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

select extract_skill_level
    ('[
      {
        "skillId": "1",
        "skillLevel": 42
      },
      {
        "skillId": "2",
        "skillLevel": 41
      }
    ]', 1);
Run Code Online (Sandbox Code Playgroud)