Postgres jsonb_set连接当前值

时间:2020-01-21 11:21:29

标签: postgresql jsonb

我正在尝试使用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?

2 个答案:

答案 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