我正在处理一个事件,该事件在最后一个条目和新条目之间的列中比较jsonb值。我有另一个表,该表定义了通过传递jsonb对象本身来比较哪些值。我正在使用的是这样的:
chart.responsive.rules.push({relevant: am4core.ResponsiveBreakpoints.widthM,
if (target instanceof am4charts.AxisRendererY) {
let state = target.states.create(stateId);
state.readerTitle.properties.fontSize = 190; //does not work
return state;
}
if (target instanceof am4charts.AxisLabel && target.parent instanceof am4charts.AxisRendererY) {
let state = target.states.create(stateId);
state.properties.paddingTop = 0;
state.properties.paddingBottom = 0;
state.properties.fontSize = 10;
state.readerTitle.properties.fontSize = 190; // does not work too
target.setStateOnChildren = true;
return state;
}
return null;
},
});
而我正在寻找的jsonb对象是这样的:
select jsonb_extract_path(_tmp_jsonb, 'key_1', 'key2') into target;
现在我可以用上面的命令得到15了,但是我想做的是能够将任何组合键作为jsonb数组传递,例如{
"key1": {"key2": 15},
"key3": {"key2": {"key4": 25}}
}
。像这样:
{"search_keys":["key3", "key2", "key4"]}
更清楚的是,我要问的是如何在postgres中使用可变长度参数数组,就像在带* args的python中一样。
答案 0 :(得分:2)
使用the #>
operator代替函数。右边的操作数是一个文本数组。
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路径可能包含通配符并支持递归。
阅读文档:
另请参阅this answer.中的jsonpath
个示例