postgresql:jsonb在一个查询中更新多个键

Apa*_*ear 6 sql postgresql psycopg2 jsonb

我将以下postgresql行作为JSONB行:

{age:26}
Run Code Online (Sandbox Code Playgroud)

我想替换它,以便我看起来像这样:

{age: 30, city: "new york city"}
Run Code Online (Sandbox Code Playgroud)

我怎么能在postgressql中做到这一点?有人提到使用jsonb_set(),但我没有看到在一个查询中更新多个键的任何示例.

小智 18

在jsonb_set()中使用jsonb_set()

jsonb_set(jsonb_set('{age:26}'::jsonb,'{age}','"30"'::jsonb)::jsonb,'{city}','"new york city"'::jsonb)
Run Code Online (Sandbox Code Playgroud)


WiR*_*R3D 5

虽然你可以嵌套 jsonb_set 操作,但阅读起来却变得非常糟糕。

相反,您可以使用jsonb_object

SET my_column = my_column || jsonb_object(
    array[ -- keys
        'age',
        'city',
        'visits'
    ],
    array[ -- values
        31::text,
        'Johannesburg'::text,
        ((my_column#>>'{visits}')::int + 1)::text -- increment
    ]
)
Run Code Online (Sandbox Code Playgroud)

注意:您将失去类型安全性,因为它只处理文本字段,但您可以进行部分更新(仅添加您想要更新的字段),并且如果您从另一种语言处理此问题,如果您的 SQL 抽象是不太规范


ana*_*kha 5

PostgreSQL 很棒。您还可以使用string concatenation operator||

UPDATE wooden_table
SET doc = doc
    || '{"color" : "red"}' 
    || '{"hardness" : "1H"}';
Run Code Online (Sandbox Code Playgroud)

此方法也适用于值侧内的 JSON 值。