Postgresql 使用变量作为jsonb_extract_路径中的搜索键

Postgresql 使用变量作为jsonb_extract_路径中的搜索键,postgresql,plpgsql,jsonb,Postgresql,Plpgsql,Jsonb,我正在处理一个事件,该事件比较列中最后一个条目和新条目之间的jsonb值。我有另一个表,它通过传递jsonb对象本身来定义要比较的值。我的工作是这样的: select jsonb_extract_path(_tmp_jsonb, 'key_1', 'key2') into target; select jsonb_extract_path(_tmp_jsonb, ["key3", "key2", "key4"]) into target; 我在里面看到的jsonb对象是: { "key1"

我正在处理一个事件,该事件比较列中最后一个条目和新条目之间的jsonb值。我有另一个表,它通过传递jsonb对象本身来定义要比较的值。我的工作是这样的:

select jsonb_extract_path(_tmp_jsonb, 'key_1', 'key2') into target;
select jsonb_extract_path(_tmp_jsonb, ["key3", "key2", "key4"]) into target;
我在里面看到的jsonb对象是:

{
 "key1": {"key2": 15},
 "key3": {"key2": {"key4": 25}}
}
现在我可以用上面的命令得到15个键了,没问题,但是我想做的是能够将任何键组合作为jsonb数组传递,比如
{“search_keys”:[“key3”、“key2”、“key4”]}
。比如说:

select jsonb_extract_path(_tmp_jsonb, 'key_1', 'key2') into target;
select jsonb_extract_path(_tmp_jsonb, ["key3", "key2", "key4"]) into target;
更清楚地说,我要问的是如何在postgres中使用可变长度参数数组,就像在python中使用*args一样。

使用而不是函数。右操作数是文本数组

declare
    _tmp_jsonb jsonb;
    _path text[];
    target jsonb;
begin
    _tmp_jsonb := '{"key1": {"key2": 15}, "key3": {"key2": {"key4": 25}}}';
    _path := array['key3', 'key2', 'key4'];
    target := _tmp_jsonb #> _path;
    ...
顺便说一下,对于简单的作业,不要使用
select
,这太昂贵了

Postgres 12中,您可以使用SQL/JSON路径函数,例如:

declare
    _tmp_jsonb jsonb;
    _path jsonpath; -- !!
    target jsonb;
begin
    _tmp_jsonb := '{"key1": {"key2": 15}, "key3": {"key2": {"key4": 25}}}';
    _path := '$.key3.key2.key4';
    target := jsonb_path_query(_tmp_jsonb, _path);
    ...
新特性灵活且功能强大,因为json路径可能包含通配符并支持递归

阅读文档:

另请参见

使用而不是函数中的
jsonpath
示例。右操作数是文本数组

declare
    _tmp_jsonb jsonb;
    _path text[];
    target jsonb;
begin
    _tmp_jsonb := '{"key1": {"key2": 15}, "key3": {"key2": {"key4": 25}}}';
    _path := array['key3', 'key2', 'key4'];
    target := _tmp_jsonb #> _path;
    ...
顺便说一下,对于简单的作业,不要使用
select
,这太昂贵了

Postgres 12中,您可以使用SQL/JSON路径函数,例如:

declare
    _tmp_jsonb jsonb;
    _path jsonpath; -- !!
    target jsonb;
begin
    _tmp_jsonb := '{"key1": {"key2": 15}, "key3": {"key2": {"key4": 25}}}';
    _path := '$.key3.key2.key4';
    target := jsonb_path_query(_tmp_jsonb, _path);
    ...
新特性灵活且功能强大,因为json路径可能包含通配符并支持递归

阅读文档:


另请参见

Nice中的
jsonpath
示例,现在是否有任何方法也可以使用通配符键?谢谢,这非常有帮助。虽然我不确定我们是否可以升级到Postgre12。很好,现在有没有办法让我也有一个通配符键?谢谢,这很有帮助。虽然我不确定我们是否能升到博士后12。