postgresql - Postgres - 附加到 jsonb 字符串
问题描述
在 Postgres 中,我有一jsonb
列foo
存储字符串数组
["a","b","c"]
我需要一个查询,它将另一个字符串附加到指定索引处当前存在的任何内容
e.g. Append "!" at index 1
run query: ["a","b","c"] -> ["a","b!","c"]
run again: ["a","b","c"] -> ["a","b!!","c"]
run again: ["a","b","c"] -> ["a","b!!!","c"]
我在 Postgres v11.2 中实现了如下
UPDATE my_table
SET foo = jsonb_set(foo, '{1}', CONCAT('"', foo->>1, '!', '"')::jsonb)
WHERE id = '12345';
请注意,为简单起见,此处仅对索引1
和字符串'!'
进行了硬编码 - 但它们将是变量。
它有效,但我觉得它很不雅。如您所见,我text
使用->>
运算符选择给定索引处的字符串,将其用作CONCAT
附加 的输入,并将其'!'
构建回正确的语法以转换回jsonb
字符串。这里要做的工作比看起来需要的要多得多,只是在给定路径处附加到字符串。
有没有更简单的方法来做到这一点?可能是内置函数或运算符,或者比使用更简单的附加方式CONCAT
?(我尝试||
以各种方式使用运算符,但似乎无法使用语法和类型进行任何操作)
解决方案
我认为没有比jsonb_set()
.
concat 可以如下替换||
:
jsonb_set(foo, '{1}', ('"' || (foo->>1) || '!"')::jsonb)
推荐阅读
- react-native-firebase - 如何在后台加载数据库中的数据?
- css - 如何将折叠切换引导程序放在浮动右侧并放在所有内容之上?
- mysql - 访问 MySQL5.7 Docker 容器导致 zsh: command not found: mysql
- javascript - 如何纠正内容配置错误
- javascript - 如何在单个 js 和 twig js 应用程序中制作 i18n
- javascript - 同时使用 Vue.js 和 jQuery 自动完成
- java - 使用 Java 8 流的两个 int 数组的笛卡尔积
- html - 有没有办法一次显示网页上的所有“悬停文本”?
- spring-cloud-config - Spring config server 从本地配置文件刷新属性
- android - 无法在需要 SU 权限的 Termux 中执行脚本