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

ymdaylpp  于 2023-05-06  发布在  PostgreSQL
关注(0)|答案(2)|浏览(141)

在一个名为priceTables的表中,我在名为value的列中存储了一个JSON对象,它看起来像这样:

{
  "price": {
    "values": {
       "tax": 1.59
     }
  }
}

并想运行一个查询来迁移数万条记录,将values的名称更改为breakdown。所以它会导致

{
  "price": {
    "breakdown": {
      "tax": 1.59
    }
  }
}

有什么关于Postgres查询的建议吗?

6ju8rftf

6ju8rftf1#

如果名称只能在JSON中出现一次,或者如果出现更多,则应替换所有出现的名称,则快速而脏的名称是文本中的简单replace()

UPDATE elbat
       SET value = replace(value::text, '"values"', '"breakdown"')::jsonb;

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

fdbelqdn

fdbelqdn2#

这个应该能用

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;

用于重命名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;

相关问题