In PostgreSQL 9.5, is there a way to rename an attribute in a jsonb field?
For example:
{ "nme" : "test" }
should be renamed to
{ "name" : "test"}
In PostgreSQL 9.5, is there a way to rename an attribute in a jsonb field?
For example:
{ "nme" : "test" }
should be renamed to
{ "name" : "test"}
In UPDATE
use delete (-) and concatenate (||) operators, e.g.:
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)
returning *
is not mandatory for the query to work. It only causes a display (like a select
) of all updated rows, that is, all rows. –
Oarlock update example SET js = JSONB_SET(js::JSONB, '{skill,c++}', js->'skill'->'c', true) where js->'skill' ? 'c';
update example SET js = js#-'{skill, c}' where js->'skill' ? 'c';
–
Detain I used the following for handling nested attributes and skipping any json that doesn't use the old name:
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';
just for reference docs:
#-
Delete the field or element with specified path (for JSON arrays, negative integers count from the end)
https://www.postgresql.org/docs/current/functions-json.html#FUNCTIONS-JSONB-OP-TABLE
#>
Get JSON object at the specified path https://www.postgresql.org/docs/current/functions-json.html#FUNCTIONS-JSON-OP-TABLE
{path, to, old_name}
it didn't seem to affect the result and I still got the right thing –
Transudate This is an old question, but still comes up high in the search rankings for this particular task. One approach that isn't all that JSON-ey but can still be a decent solution (if there is a minimal risk of key-naming collision) is to handle the field as TEXT, do a replace (could be a regex too) and then cast back to JSON.
Something like this, borrowing @klin's setup:
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 *;
© 2022 - 2024 — McMap. All rights reserved.