我正在尝试使用jsonb_set更新数据库中的一系列json对象。我可以使查询工作以字符串值更新对象,但是似乎无法使用当前值来更新它。
UPDATE entity
SET properties = jsonb_set(properties, '{c_number}', concat('0', properties->>'c_number'))
WHERE type = 1 and length(properties->>'c_number') = 7
以上内容不适用于当前格式,我认为问题是jsonb_set内部的properties->>'c_number'
。有没有办法我可以访问当前值并简单地添加前导0?
答案 0 :(得分:2)
找到了解决方案:
UPDATE entity
SET properties = jsonb_set(properties, '{c_number}', concat('"0', properties->>'c_number', '"')::jsonb)
WHERE type = 1 and length(properties->>'c_number') = 7
答案 1 :(得分:0)
基于 this answer 我能够准备我的解决方案。
我的目标是在 JSON 中创建一个新属性,其值基于我的 JSON 已经拥有的属性之一的值。
例如:
我有:
{
property_root: { property_root_child: { source_property_key: "source_property_value" } }
}
我想要:
{
property_root: { property_root_child: { source_property_key: "source_property_value", target_property_key: "source_property_value + my custom ending" } }
}
所以我的查询看起来是:
UPDATE database.table_with_json
SET json_column=jsonb_set(
json_column,
'{ property_root, property_root_child, target_property_key }',
concat('"', json_column->'property_root'->'property_root_child'->>'source_property_key', ' + my custom ending', '"')::jsonb)
WHERE
json_column->'property_root'->'property_root_child'->'source_property_key' IS NOT NULL
为什么 concat
看起来很乱?基于上述答案:
jsonb_set() 的第三个参数应该是 jsonb 类型。问题是在将文本字符串转换为 jsonb 字符串时,您需要一个用双引号括起来的字符串。
这就是为什么我们必须用双引号包裹 concat
。