我有一个带有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;
但是,我需要一种方法来添加新的键值(如果它不存在)并更新键值(如果存在)。是否可以在单个查询中实现此目的?
答案 0 :(得分:54)
||运算符连接每个操作数顶层的元素。 ... 例如,如果两个操作数都是具有公共键字段名称的对象,则结果中字段的值将只是右手操作数的值。
所以使用你的示例数据:
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对象
||