代码之家  ›  专栏  ›  技术社区  ›  crowhoplaminar

Postgres JSONB字段中的全局替换

  •  10
  • crowhoplaminar  · 技术社区  · 7 年前

    我需要全局替换嵌套JSON结构中出现多个位置的特定字符串,该字符串存储为postgres表中的jsonb。例如:

    {
      "location": "tmp/config",
      "alternate_location": {
        "name": "config",
        "location": "tmp/config"
      }
    }
    

    ...应成为:

    {
      "location": "tmp/new_config",
      "alternate_location": {
        "name": "config",
        "location": "tmp/new_config"
      }
    }
    

    我尝试过:

    UPDATE files SET meta_data = to_json(replace(data::TEXT, 'tmp/config', 'tmp/new_config'));
    

    不幸的是,这会导致格式错误的JSON,并带有三个转义引号。

    有什么办法吗?

    2 回复  |  直到 5 年前
        1
  •  23
  •   klin    7 年前

    使用简单的强制转换 jsonb 而不是 to_json() ,例如:

    with files(meta_data) as (
    values(
    '{
      "location": "tmp/config",
      "alternate_location": {
        "name": "config",
        "location": "tmp/config"
      }
    }'::jsonb)
    )
    
    select replace(meta_data::text, 'tmp/config', 'tmp/new_config')::jsonb
    from files;
    
                                                    replace                                                 
    --------------------------------------------------------------------------------------------------------
     {"location": "tmp/new_config", "alternate_location": {"name": "config", "location": "tmp/new_config"}}
    (1 row)
    
        2
  •  5
  •   Tyler2P Erik    2 年前

    使用更新:

    UPDATE files SET meta_data = replace(data::TEXT, 'tmp/config', 'tmp/new_config')::jsonb;