首页 > 解决方案 > Postgres - 附加到 jsonb 字符串

问题描述

在 Postgres 中,我有一jsonbfoo存储字符串数组

["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?(我尝试||以各种方式使用运算符,但似乎无法使用语法和类型进行任何操作)

标签: postgresqljsonb

解决方案


我认为没有比jsonb_set().

concat 可以如下替换||

jsonb_set(foo, '{1}', ('"' || (foo->>1) || '!"')::jsonb)

推荐阅读