JSONB替换价值的一个具体的关键Postgresql

0

的问题

我需要更换值的具体键内jsonb目的在Postgresql:

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"}

而不是替换所有的次出现的"文本1",我想仅仅替代文本的内部价值"键1":如何这样做?

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

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

更新的期望的结果,这是不够明确。

jsonb postgresql replace
2021-11-22 13:55:53
2

最好的答案

1

使用的功能 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<>的小提琴。

2021-11-22 14:25:16

就是这样,谢谢你!
Stefano De Rosso
0

你可以使用的操作员 || 联系的两个java和产生新的java. 现在我们可以使用 || 加入老java到new java(如: {"key2": "text2"})

演示

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

Ps:

此外,您可以使用 jsonb_set 功能改变的数据。

演示

update content
set dynamic_fields = jsonb_set(dynamic_fields, '{key2}', '"text2"');
2021-11-22 14:09:06

我希望将现有案文保持不变,所以这工作只有在价值是"文本1"我想改变它对"文本2",但是如果我"啊哈文本1"我想改变它对"啊哈文本2"它不工作。 我需要更换一部分串,不更新整个串。
Stefano De Rosso

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................