我有一个类似于以下内容的JSON对象:
{
"key1" : "value1",
"key2" : {
"messagebody" : {
"version" : "1"
},
"messageheader" : {
"reference" : "a reference"
}
}
}
此内容存储在PostgeSQL
表中列为jsonb
的列中。我现在的目标是找到字段version
和字段reference
。但是json的结构可能会有所不同,例如key2
在另一条记录中可以命名为key3
。
PostgreSQL中是否有一个查询,可以让我给它一个键并在对象中查找该键的值,而无需知道它在对象中的位置?
PostgreSQL版本是10。
答案 0 :(得分:1)
在Postgres 10中,使用递归查询。
with recursive extract_all as
(
select
key,
value
from my_table
cross join lateral jsonb_each(jdata)
union all
select
obj_key,
obj_value
from extract_all
left join lateral
jsonb_each(value)
as o(obj_key, obj_value)
on jsonb_typeof(value) = 'object'
where obj_key is not null
)
select *
from extract_all
where key in ('version', 'reference')
Postgres 12+允许使用SQL / JSON路径的替代解决方案。
select
'version' as key,
jsonb_path_query(jdata, '$.**.version') as value
from my_table
union all
select
'reference' as key,
jsonb_path_query(jdata, '$.**.reference') as value
from my_table