jsonb字段中的PostgreSQL重命名属性

T. *_*ong 21 postgresql json jsonb postgresql-9.5

在postgresql 9.5中,有没有办法在jsonb字段中重命名属性?

例如:

{ "nme" : "test" }
Run Code Online (Sandbox Code Playgroud)

应该重命名为

{ "name" : "test"}
Run Code Online (Sandbox Code Playgroud)

kli*_*lin 41

UPDATE使用delete( - )和concatenate(||)运算符,例如:

create table example(id int primary key, js jsonb);
insert into example values
    (1, '{"nme": "test"}'),
    (2, '{"nme": "second test"}');

update example
set js = js - 'nme' || jsonb_build_object('name', js->'nme')
where js ? 'nme'
returning *;

 id |           js            
----+-------------------------
  1 | {"name": "test"}
  2 | {"name": "second test"}
(2 rows)
Run Code Online (Sandbox Code Playgroud)

  • 如果有人想知道,`returning *` 对于查询的工作不是强制性的。它只会导致所有更新行的显示(如“选择”),即所有行。 (5认同)

roc*_*ady 14

这是一个老问题,但在该特定任务的搜索排名中仍然居高不下。一种方法虽然不是 JSON-ey 但仍然是一个不错的解决方案(如果键命名冲突的风险最小)是将字段处理为 TEXT,进行替换(也可以是正则表达式)并然后转换回 JSON。

像这样,借用@klin的设置:

CREATE TABLE example(id INT PRIMARY KEY, js JSONB);
INSERT INTO example VALUES
    (1, '{"nme": "test"}'),
    (2, '{"nme": "second test"}');

UPDATE EXAMPLE
SET js = (REPLACE(js::TEXT, '"nme"', '"name"'))::JSONB
RETURNING *;
Run Code Online (Sandbox Code Playgroud)


eml*_*lai 5

我使用以下代码来处理嵌套属性,并跳过不使用旧名称的所有json:

UPDATE table_name
SET json_field_name = jsonb_set(json_field_name #- '{path,to,old_name}',
                                '{path,to,new_name}',
                                json_field_name#>'{path,to,old_name}')
WHERE json_field_name#>'{path,to}' ? 'old_name';
Run Code Online (Sandbox Code Playgroud)