使用变量作为jsonb_extract_path中的搜索键

时间:2019-10-06 00:23:35

标签: postgresql plpgsql jsonb

我正在处理一个事件,该事件在最后一个条目和新条目之间的列中比较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中一样。

1 个答案:

答案 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个示例