我的Postgres数据库中有一个表master_data_approval_table,其中包含字段approval_value(Jsonb类型),其中包含以下JSON struct :

[{
        "name": "abc",
        "email": "abc.pqr@gmail.com"
    },
    {
        "name": "xyz",
        "email": "xyz.pqr@gmail.com"
    }
]

现在,我们希望在数组的每个对象中再添加一个键-值对,即"comment": null,如下所示:

[{
        "name": "abc",
        "email": "abc.pqr@gmail.com",
        "comment": null
    },
    {
        "name": "xyz",
        "email": "xyz.pqr@gmail.com",
        "comment": null
    }
]

更重要的是,我们需要对表中的所有记录执行此操作. 我已经try 了不同的现有答案和查询,但没有帮助,所以请有人指导我如何在上面的场景中用PostgreSQL编写查询.

先谢谢你.

推荐答案

您可以使用jsonb_array_elements()取消JSON数组的嵌套,使用||修改每个对象以添加新的键/值,最后按照原始顺序聚合回jsonb_agg():

select t.approval_value, e.new_approval_value
from master_data_approval_table t
cross join lateral (
    select jsonb_agg( e.elt || '{"comment": null}' order by e.seq) new_approval_value
    from jsonb_array_elements(t.approval_value) with ordinality as e(elt, seq)
) e
approval_value new_approval_value
[
    {
        "name": "abc",
        "email": "abc.pqr@gmail.com"
    },
    {
        "name": "xyz",
        "email": "xyz.pqr@gmail.com"
    }
]
[
    {
        "name": "abc",
        "email": "abc.pqr@gmail.com",
        "comment": null
    },
    {
        "name": "xyz",
        "email": "xyz.pqr@gmail.com",
        "comment": null
    }
]

如果要实际修改列中的值,则应为update:

update master_data_approval_table t
set approval_value = (
    select jsonb_agg( e.elt || '{"comment": null}' order by e.seq) new_approval_value
    from jsonb_array_elements(t.approval_value) with ordinality as e(elt, seq)
)

fiddle

Sql相关问答推荐

如何在SQL查询中只比较日期时间的年份和月份(而忽略日期比较)?

在数据分区内执行确定

LAG函数通过丢弃空值返回前一行

如何在SQL中按每个子组的顺序更新数据?

从依赖于其他表的值的XREF表中的值分组获得正确的计数?

重新组合已排序的日期范围

如何嵌套两条SQL语句

收到%1、%2或%2邮箱的唯一客户

按日期时间(不包括秒)连接表

需要从键-值对数据中提取值

违反了完整性约束-值存在时找不到父键

用替代方案替换 SQL Cursor 以提高性能

试图找到两个身份列表的交集(列表的长度不同),但获取列 id 不明确?

有没有办法在雅典娜中将字符串转换为 int ?

复制SQL Server临时表

批量更改WooCommerce中所有产品的税收状态

String_Split 多列

As400 (IBM i) SQL 表 QSYS2.SYSTABLES 上的元数据

Oracle SQL 查询自行运行,但在包装到select count(*) from ()时失败

当我按 PK 分组时,该表中的所有列在每个组中都具有相同的值.那么为什么 SQL Server 需要对这些列进行聚合呢?