postgres jsonb_set多个密钥更新

时间:2016-08-10 20:46:49

标签: postgresql

我有一个带有jsonb列的数据库表。

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

我需要一种更新数据列的方法。 所以我的输出应该如下:

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

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

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

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

2 个答案:

答案 0 :(得分:54)

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"}')
...

答案 1 :(得分:1)

你可以试试这个

这里我们使用def millitosec(milliseconds): x = milliseconds / 1000 seconds = x % 60 x /= 60 minutes = x % 60 x /= 60 hours = x % 24 x /= 24 days = x return seconds, minutes, hours, days 连接运算符jsonb来连接两个jsonb对象

||