【问题标题】:JSONB replace value of a specific key PostgresqlJSONB 替换特定键 Postgresql 的值
【发布时间】:2022-01-01 02:54:50
【问题描述】:

我需要替换 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"}

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

【问题讨论】:

    标签: postgresql replace jsonb


    【解决方案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<>fiddle.测试它

    【讨论】:

    • 就是这样,谢谢!
    【解决方案2】:

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

    Demo

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

    附注:

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

    Demo

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

    【讨论】:

    • 我希望现有文本保持不变,所以这仅适用于值为“text1”并且我想将其更改为“text2”,但如果我有“aaaaaa text1”并且我想要将其更改为“aaaaaa text2”是行不通的。我需要替换字符串的一部分,而不是更新整个字符串。
    猜你喜欢
    • 1970-01-01
    • 2011-01-07
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2021-11-23
    • 2018-03-07
    相关资源
    最近更新 更多