postgres jsonb_set多个密钥更新

sta*_*ode 34 postgresql

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

number  | data
    1   | {"name": "firstName", "city": "toronto", "province": "ON"}
Run Code Online (Sandbox Code Playgroud)

我需要一种更新数据列的方法.所以我的输出应该是这样的:

{"name": "firstName", "city": "ottawa", "province": "ON", "phone": "phonenum", "prefix": "prefixedName"}
Run Code Online (Sandbox Code Playgroud)

用json_set可以吗?我添加了如下查询:

update table_name set data = jsonb_set(data, '{city}', '"ottawa"') where number = 1;
Run Code Online (Sandbox Code Playgroud)

但是,我需要一种方法来添加新的键值(如果它不存在)并更新键值(如果它存在).是否可以在单个查询中实现此目的?

Abe*_*sto 67

文件说:

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

所以使用你的示例数据:

update table_name set
  data = data || '{"city": "ottawa", "phone": "phonenum", "prefix": "prefixedName"}'
where number = 1;
Run Code Online (Sandbox Code Playgroud)

此外,如果您要编辑的对象不在顶层 - 只需组合连接和jsonb_set功能.例如,如果原始数据看起来像

{"location": {"name": "firstName", "city": "toronto", "province": "ON"}}
Run Code Online (Sandbox Code Playgroud)

然后

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

  • @MarcoPrins您是否尝试过阅读Oracle文档?与之相比,PostgreSQL文档是文学杰作:o) (9认同)
  • 如果您要从查询中的动态数据填充更新的字段和/或更新多个字段,这是有用的提示。您可以使用“json_build_object”来创建更新对象。例如:`数据->'位置'|| jsonb_build_object('city', "cityColName", 'phonenum', "phoneCalName")`. 这比尝试动态创建 jsonb 字符串要容易得多,如 @Paarth 下面建议的那样。 (4认同)
  • 太棒了,这就像魅力一样。谢谢!我还不能投票,因为我没有足够的分数,但绝对要竖起大拇指。 (3认同)
  • 您如何阅读Postgres文档而又没有完全丢失它 (3认同)