如何遍历 JSONb 字段中包含的数组?
Posted
技术标签:
【中文标题】如何遍历 JSONb 字段中包含的数组?【英文标题】:How to loop through an array contained in a JSONb field? 【发布时间】:2017-01-24 19:30:08 【问题描述】:如何循环访问 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]
【问题讨论】:
select * from "rule" r, json_array_elements(r.expressions)
@a_horse_with_no_name,不,也不起作用。我认为该错误意味着 Postgres 中没有接受 jsonb
参数的函数。所以,jsonb
肯定还有其他功能
啊,没看到jsonB
。为此,您当然必须使用jsonB_array_length
@a_horse_with_no_name,但 array_length 只会返回一个整数,我需要一个数组来循环它通过 FOR
块。 jsonB
的所有函数都有B
结尾吗?看起来像未记录的功能。
@a_horse_with_no_name ,抱歉,它已记录在案,我正在查看首先出现在 Google 中的 9.1 文档
【参考方案1】:
与@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函数结果的列别名。
相关:
How to turn json array into postgres array?【讨论】:
以上是关于如何遍历 JSONb 字段中包含的数组?的主要内容,如果未能解决你的问题,请参考以下文章