Postgresql 使用变量作为jsonb_extract_路径中的搜索键
我正在处理一个事件,该事件比较列中最后一个条目和新条目之间的jsonb值。我有另一个表,它通过传递jsonb对象本身来定义要比较的值。我的工作是这样的: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"
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。