postgresql - 更新 postgres jsonb 列
问题描述
我的表列中有以下 json 字符串,它的类型为 jsonb,
{
"abc": 1,
"def": 2
}
我想从中删除“abc”键并插入带有一些默认值的“mno”。我遵循以下方法。
UPDATE books SET books_desc = books_desc - 'abc';
UPDATE books SET books_desc = jsonb_set(books_desc, '{mno}', '5');
它有效。
现在我有另一个带有 json 的表,如下所示,
{
"a": {
"abc": 1,
"def": 2
},
"b": {
"abc": 1,
"def": 2
}
}
即使在这个 json 中,我也想做同样的事情。取出“abc”并引入带有一些默认值的“mno”。请帮助我实现这一目标。
键“a”和“b”是动态的并且可以改变。但是“a”和“b”的值将始终具有相同的键,但值可能会改变。我需要一个通用的逻辑。
要求 2:
abc:true 应该转换为 xyz:1。
abc:false 应该被转换为 xyz:0。
解决方案
由于您的 JSON 键可能多种多样,因此生成通用查询可能会很复杂。这是因为您需要在json_set()
函数中给出路径。但是如果没有实际值,那就很难了。
一个简单的解决方法是使用regexp_replace()
JSON 字符串的文本表示上的函数来替换相关对象。
UPDATE my_table
SET my_data =
regexp_replace(my_data::text, '"abc"\s*:\s*\d+', '"mno":5', 'g')::jsonb
推荐阅读
- firebase - Firebase 存储安全?
- reactjs - 在 React Native 中垂直对齐组件
- html - 如何为两个 div 的一半提供背景颜色?
- c - devc++中,为什么只能输入数字,却不能求和?
- android - Android TV 中的谷歌助手和应用操作问题
- spring - 不要使用 RestTemplate 向服务发出相同的 http 请求,而是在不使用数据库的情况下将响应缓存在某处?
- flutter - 应该只有一项具有 [DropdownButton] 的值
- angular - Angular 应用程序在完全加载之前显示屏幕空白
- google-cloud-platform - 将 Google 托管的 ssl 证书与 dockerized uwsgi 应用程序一起使用
- css - 带有 flexbox 的 CSS 定位元素