JSONB 替换特定键的值 Postgresql

JSONB replace value of a specific key Postgresql

我需要替换 Postgresql 中 jsonb 对象中特定键的值:

create table content (
  id int,
  dynamic_fields jsonb
  );
  
insert into content values (0, '{
    "key1": "aaaaa text1",
    "key2": "text1",
    "key3": "blabla"}'::jsonb);

UPDATE content 
SET dynamic_fields = replace(dynamic_fields::text, 'text1', 'text2')::jsonb;

此处的这段代码给出了以下结果:

id |    dynamic_fields  
0  |  {"key1": "aaaaa text2", "key2": "text2", "key3": "blabla"}

我不想替换所有出现的“text1”,而是只想替换“key1”值内的文本:我该怎么做?

更新的结果应该是这样的:

id |    dynamic_fields  
0  |  {"key1": "aaaaa text1", "key2": "text2", "key3": "blabla"}

更新了期望的结果,不够清楚。

您可以使用运算符||联系两个JSON数据并生成新的JSON数据。 现在我们可以使用 || 将旧的 JSON 数据连接到新的 JSON 数据(如:{"key2": "text2"}

Demo

update content
set dynamic_fields = dynamic_fields || '{"key2": "text2"}'::jsonb;

P.S:

此外,您可以使用jsonb_set函数来更改数据。

Demo

update content
set dynamic_fields = jsonb_set(dynamic_fields, '{key2}', '"text2"');

使用函数jsonb_build_object().

update content
set dynamic_fields = 
    dynamic_fields || 
    jsonb_build_object('key1', replace(dynamic_fields->>'key1', 'text1', 'text2'))
where dynamic_fields ? 'key1'

Db<>fiddle.

中测试