如何遍历 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 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函数结果的列别名。

相关:

How to turn json array into postgres array?

【讨论】:

以上是关于如何遍历 JSONb 字段中包含的数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历标签栏控制器中包含的每个导航控制器

如何获取 PostgreSQL jsonb 字段的大小?

如何查询带有数组的jsonb字段

如何评估访问查询中另一个字段中包含的字段名称?

如何获取 NSFontCollection 中包含的字体数组?

如何找到 JavaScript 数组中包含的最大数?