首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数组中的PostgreSQL jsonb_set多元素

数组中的PostgreSQL jsonb_set多元素
EN

Stack Overflow用户
提问于 2022-10-05 10:58:36
回答 1查看 66关注 0票数 2

在名为recipients的表中,列mailing中有以下jsonb结构

代码语言:javascript
运行
复制
[
    {
        "text": "Text1",
        "smsId": 1,
        "value": "123456",
        "status": "Sent"
    },
    {
        "text": "Text1",
        "smsId": 2,
        "value": "23456",
        "status": "Sent"
    },
    {
        "text": "Text1",
        "smsId": 3,
        "value": "345678",
        "status": "Sent"
    }]

我需要更新多个元素中的一个字段,因此结果应该如下所示:

代码语言:javascript
运行
复制
[
{
    "text": "Text1",
    "smsId": 1,
    "value": "123456",
    "status": "Delivered"
},
{
    "text": "Text1",
    "smsId": 2,
    "value": "23456",
    "status": "Delivered"
},
{
    "text": "Text1",
    "smsId": 3,
    "value": "345678",
    "status": "Delivered"
}]

我要解决的最接近的问题是:

代码语言:javascript
运行
复制
WITH item AS (SELECT mailing_id, ('{' || INDEX-1 || ',status}')::text[] AS PATH
            FROM mailing, jsonb_array_elements(recipients) WITH ORDINALITY arr(recipient, INDEX) 
            WHERE recipient->>'smsId' = any(array['1', '2', '3']))
UPDATE mailing m 
SET recipients = jsonb_set(recipients, item.path, '"Delivered"',FALSE) 
FROM item 
WHERE m.mailing_id = item.mailing_id;

但是这个解决方案只更新第一行,我不确定是否应该以某种方式循环这个或尝试不同的方法?

EN

回答 1

Stack Overflow用户

发布于 2022-10-05 13:47:05

您需要使用jsonb_agg()聚合修改过的数组元素

代码语言:javascript
运行
复制
with new_data as (
    select 
        mailing_id, 
        jsonb_agg(
            case when value->>'smsId' = any('{1,2,3}') then value || '{"status": "Delivered"}'
            else value
            end) as recipients
    from mailing
    cross join jsonb_array_elements(recipients)
    group by mailing_id
)
update mailing m 
set recipients = n.recipients
from new_data n
where m.mailing_id = n.mailing_id;

db<>fidlle中测试它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73959401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档