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

Sql 如何为所有记录更改Postgres中存储的JSON对象中的键的名称,sql,postgresql,Sql,Postgresql,在一个名为priceTables的表中,我在一个名为value的列中存储了一个JSON对象,它看起来类似于以下内容: { “价格”:{ “价值观”:{ “税”:1.59 } } } 并希望运行一个查询来迁移成千上万条记录,以将值的名称更改为细分。因此,它将导致 { “价格”:{ “细分”:{ “税”:1.59 } } } 如果名称在JSON中只能出现一次,或者如果出现的次数更多,则应替换所有出现的名称,那么在文本中,一个快速且脏的名称是一个简单的replace(): UPDATE elbat

在一个名为
priceTables
的表中,我在一个名为
value
的列中存储了一个JSON对象,它看起来类似于以下内容:

{
“价格”:{
“价值观”:{
“税”:1.59
}
}
}

并希望运行一个查询来迁移成千上万条记录,以将
值的名称更改为
细分
。因此,它将导致

{
“价格”:{
“细分”:{
“税”:1.59
}
}
}


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

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

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

如果名称在json中只能出现一次,或者如果出现的次数较多,则应将所有出现的名称替换为
json
,则在文本中,快速且不干净的替换是一个简单的
Replace()

UPDATE elbat
       SET value = replace(value::text, '"values"', '"breakdown"')::jsonb;
(如果列的类型是
json
而不是
jsonb
,则将
jsonb
替换为
json

这应该有效

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;
这应该行得通

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;