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

Postgresql, retrieve value for specific key from json array

我有 Postgres JSONB 对象数组,如下所示:

'[
  {
    "skillId": "1",
    "skillLevel": 42
  },
  {
    "skillId": "2",
    "skillLevel": 41
  }
]'

这个 JSONB 是一个函数参数。

skillId = "1" 检索 skillLevel 的最有效方法是什么。

我试过 jsonb_array_elements 但到目前为止我所做的一切看起来都很乱。

Postgres 9.4+ 中,在横向连接中使用函数 jsonb_array_elements()

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

您可以在一个简单的函数中实现这个想法,例如:

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;

Postgres 12+ 中,您有一个不错的替代方案,其形式为 jsonb 路径函数:

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

Db<>Fiddle.

阅读更多关于 JSON Functions and Operators.