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;
我有 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;