如何在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}]
答案 0 :(得分:2)
Like @a_horse commented无法使用jsonb_array_elements()
取消jsonb
数组。另外,我建议[INNER] JOIN
而不是CROSS JOIN
。 CROSS 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函数结果的表和列别名。
相关: