我有一个带有jsonb列的DB表.

number  | data
    1   | {"name": "firstName", "city": "toronto", "province": "ON"}

我需要一种更新数据列的方法.

{"name": "firstName", "city": "ottawa", "province": "ON", "phone": "phonenum", "prefix": "prefixedName"}

使用json_设置是否可能?

update table_name set data = jsonb_set(data, '{city}', '"ottawa"') where number = 1;

但是,如果不存在,我需要一种方法来添加新的键值,如果存在,则更新键值.有可能在单个查询中实现这一点吗?

推荐答案

documentation says人:

| |运算符在其每个操作数的顶层连接元素 例如,如果两个操作数都是具有公共键字段名称的对象,则结果中字段的值将仅为右侧操作数的值.

因此,使用您的示例数据:

update table_name set
    data = data || '{"city": "ottawa", "phone": "phonenum", "prefix": "prefixedName"}'
    where number = 1;

此外,如果要编辑的对象不在顶层,只需将串联和jsonb_set函数结合起来即可.例如,如果原始数据

{"location": {"name": "firstName", "city": "toronto", "province": "ON"}}

然后

...
data = jsonb_set(
    data, 
    '{location}', data->'location' || '{"city": "ottawa", "phone": "phonenum", "prefix": "prefixedName"}')
...

Postgresql相关问答推荐

PostgreSQL:重新创建主键值以匹配记录计数

在Ubuntu 18.04 Bionic上安装PostgreSQL(已删除回购)

PL/pgSQL中的IP递增函数

错误:用户需要系统密码:postgres

如何在 postgres where 子句中使用 or 对条件进行组合或分组

PostgreSQL 中的 Datum 数据类型是什么以及它的用途是什么?

带有附加组的时间刻度 interpolated_average

这个 Supbase 查询在 SQL ( Postgresql ) 中的类似功能是什么

如何将 JSONB 对象数组合并为 PostgreSQL 中的单个对象

使用 ON CONFLICT 从 INSERT 返回行,无需更新

'active' 标志与否?

Postgresql SERIAL 的工作方式是否不同?

H2 postgresql mode模式似乎不起作用

如何使用 psql 命令列出、创建、使用和判断数据库?

如何在 psql 控制台中打印当前工作目录?

SQL:多次重复结果行,并对行进行编号

如何删除 Postgres 上的所有数据库?

PostgreSQL 嵌套 CTE 和 UNION

错误:ERROR: table name specified more than once

Ruby 中 DateTime 的毫秒分辨率