sql - postgres jsonb更新数组中的键值
问题描述
我有一个表,其中有一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
解决方案
如果它只出现一次,您可以使用正则表达式:
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;
正则表达式组:
(.*)
相关键之前的所有字符("c_id"\s*:\s*)
相关密钥包括。可能的空间(719)
要替换的相关值(.*)
相关点之后的所有内容
将\1\2720\4
前两组放在一起,然后是新值(而不是第 3 组)和第四组。
免责声明:
我完全同意@a_horse_with_no_name:您应该考虑将所有值存储在单独的规范化表/列中。您将获得很多好处(更好的搜索和更新处理、索引、性能……)。如果你需要这个 JSON 输出,把它当作输出处理即可:需要时生成,不要存储。也许一个视图可以帮助很多
推荐阅读
- go - 如果我包装我的对象,Golang 转换为自定义类型会失败
- c# - SilverLight/WPF viewmodel 命令属性
- django - Django 模型范围从 到
- arrays - 循环工作表代码名数组 VBA
- eclipse-plugin - 如何从类中调用@canExecute 方法
- karma-jasmine - 具有多个项目的 Angular 6 应用程序。如何运行所有规范文件?ng test 只运行第一个项目
- scala - 游戏未提取的外部资产
- spring - 使用 docker 容器在 Java 应用程序中将前端与后端分开
- ios - 如何在 iOS 中过滤泛型类型的数组
- swift - 在 Swift 中捕获 cmd + 时出错