postgresql jsonb在对象中查找关键字

时间:2019-12-17 11:56:59

标签: postgresql jsonb

我有一个类似于以下内容的JSON对象:

{
    "key1" : "value1",
    "key2" : {
        "messagebody" : {
            "version" : "1"
        },
        "messageheader" : {
            "reference" : "a reference"
        }
    }
}

此内容存储在PostgeSQL表中列为jsonb的列中。我现在的目标是找到字段version和字段reference。但是json的结构可能会有所不同,例如key2在另一条记录中可以命名为key3

PostgreSQL中是否有一个查询,可以让我给它一个键并在对象中查找该键的值,而无需知道它在对象中的位置?

PostgreSQL版本是10。

1 个答案:

答案 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

Db<>fidlle.