arrays - 如何循环遍历 JSONb 字段中包含的数组?

标签 arrays json postgresql plpgsql

如何循环遍历 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 JOINCROSS 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/

相关文章:

c++ - 从二维数组中获取一维数组索引

javascript - 将数组传递给 JavaScript 显示为对象

django - 数据库连接限制是什么意思?

ruby-on-rails - 将大型数据集导入数据库

python - 使用 psycopg2 将值从 pandas 系列传递到 PostgreSQL 查询

javascript - 在 HTML 中动态显示 JavaScript 数组

c - 在函数参数中传递的数组是否被视为按引用调用?

python - 用JSON数据包装python类,哪个更好?

java - Jasper 子报表在标题带中嵌入时仅显示来自 JSON 数据源的一个条目

json - 如何在 jq 中解构后重建单个对象