我有一个带有jsonb
列的表,其中的数据来自一行
[
{
"a": [],
"c_id": 624,
"ps": [{"": 0, "pr": "73", "f": "M", "s": "M"}],
"g_n": "K L Mish",
"g_num": 1
},
{
"a": [],
"c_id": 719,
"ps": [{"": 0, "pr": "65433", "f": "R", "s": "W"}],
"g_n": "S H Star",
"g_num": 2
},
]
我想将表中的c_id
更新为719到720。
我该怎么办?
我正在使用Postgres 12.1
答案 0 :(得分:1)
如果只有一次,可以使用正则表达式来实现:
UPDATE mytable
SET mydata = s.result::jsonb
FROM (
SELECT
regexp_replace(mydata::text, '(.*)("c_id"\s*:\s*)(719)(.*)','\1\2720\4') AS result
FROM
mytable
) s;
RegExp组:
(.*)
相关密钥之前的所有字符("c_id"\s*:\s*)
相关密钥,包括。可能的空间(719)
要替换的相关值(.*)
相关点之后的所有内容使用\1\2720\4
将前两个组放在一起,然后是新值(而不是第3组)和第四个组。
免责声明:
我完全同意@a_horse_with_no_name:您应该考虑将所有值存储在单独的标准化表/列中。您将获得很多好处(更好的搜索和更新处理,索引编制,性能等等)。如果需要此JSON输出,则将其作为输出处理:在需要时生成它,而不存储它。也许一个视图会很有帮助