如何遍历JSONb字段中包含的数组?

时间:2017-01-24 19:30:08

标签: arrays json postgresql plpgsql

如何在Postgres 9.6中的PLPGSQL函数内循环包含在jsonb字段中的数组?

这是我的现场声明:

CREATE TABLE afact_rule(
    ...
    expressions         jsonb,
    ...
)

这是我的 FUNCTION

        FOR expression IN SELECT * FROM json_array_elements(rule.expressions) LOOP
            CASE expression.field 
                WHEN 'task_id' THEN
                    ... whatever ...
            END CASE;
        END LOOP;   

这是我使用它时遇到的错误:

LINE 1: SELECT * FROM json_array_elements(rule.expressions)
                      ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
QUERY:  SELECT * FROM json_array_elements(rule.expressions)

循环遍历jsonb字段中包含的数组的最佳(有效)方法是什么?

rule.expressions的内容是:

 [{"field": "dep_id", "value": 1, "operator_code": 1},
  {"field": "title", "value": "customer", "operator_code": 2}]

1 个答案:

答案 0 :(得分:2)

Like @a_horse commented无法使用jsonb_array_elements()取消jsonb数组。另外,我建议[INNER] JOIN而不是CROSS JOINCROSS JOIN是一个冗长的变体语法变体 - 并且比一个简单的逗号(,更紧密地绑定):

SELECT * -- do something?
FROM   afact_rule a
JOIN   LATERAL jsonb_array_elements(a.expressions) exp ON exp->>'field' = 'task_id';

立即消除JOIN条件中的限定元素(和行)应该是最有效的。 (语法非常清晰,即使它与后来的WHERE条件产生相同的查询计划。)

在这种情况下,LATERAL关键字是可选噪声,因为无论如何都假定FROM子句中的集合返回函数(SRF)。

exp是此处自动生成SRF函数结果的表列别名。

相关: