如何循环遍历 Postgres 9.6 中 PLPGSQL 函数内 jsonb
字段中包含的数组?
这是我的字段声明:
CREATE TABLE afact_rule(
...
expressions jsonb,
...
)
这是我的功能:
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}]
最佳答案
喜欢@a_horse commented ,使用jsonb_array_elements()
取消嵌套 jsonb 数组。另外,我建议用[INNER] JOIN
代替CROSS JOIN
。 CROSS JOIN
是 - 的详细变体语法变体,并且比 - 的简单逗号 (,
) 绑定(bind)得更紧密:
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 函数结果的表和列别名。
相关:
关于arrays - 如何循环遍历 JSONb 字段中包含的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41837376/