如何更改存储在 Postgres 中所有记录的 JSON 对象中的键名称

Kha*_*jar 6 sql postgresql

在名为的表中,priceTables我存储在名为valueJSON 对象的列中,该对象看起来类似于以下内容:

{
  "price": {
    "values": {
       "tax": 1.59
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

并希望运行查询来迁移数万条记录以将名称更改valuesbreakdown。所以这会导致

{
  "price": {
    "breakdown": {
      "tax": 1.59
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

对于实现此目的的 Postgres 查询有什么建议吗?

sti*_*bit 8

如果名称在 JSON 中只能出现一次,或者如果出现多次,则所有出现的地方都应该被替换,那么快速而肮脏的名称replace()在文本中很简单:

UPDATE elbat
       SET value = replace(value::text, '"values"', '"breakdown"')::jsonb;
Run Code Online (Sandbox Code Playgroud)

(如果列的类型不是 ,则替换为jsonb。)jsonjsonjsonb


fil*_*rem 3

这应该有效。

UPDATE priceTables
SET value = value || jsonb_build_object(
  'price',
  jsonb_build_object(
    'breakdown',
    priceTables.value #> '{price,values}'
  )
)
WHERE priceTables.value #> '{price,values}' IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

用于重命名 JSONB 列中的二级键的通用版本:

UPDATE my_table
SET json_column = json_column || jsonb_build_object(
  'level_1_key',
  jsonb_build_object(
    'level_2_key_renamed',
    json_col #> '{level_1_key,level_2_key}'
  )
)
WHERE my_table.json_col #> '{level_1_key,level_2_key}' IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)