I had to do some data wrangling which involved renaming a stack of jsonb keys in PostgreSQL.
This stackoverflow answer gives the correct SQL syntax. As it’s a bit fiddly getting the paths in the right place, I dredged up some PL/pgSQL to write a function I can re-use.
Top tips for writing PL/pgSQL (it’s been a long time): don’t accidentally put tab characters in your script, and remember assignment is := not just plain old equals.
Here’s the function:
CREATE OR REPLACE FUNCTION rename_jsonb_key(data jsonb, basepath text[], oldname text, newname text) returns jsonb AS $$ DECLARE oldpath text[]; newpath text[]; value jsonb; result jsonb; BEGIN IF data #> basepath ? oldname THEN oldpath := basepath || oldname; newpath := basepath || newname; value := data #> oldpath; result := jsonb_set(data #- oldpath, newpath, value); ELSE result := data; END IF; RETURN result; END; $$ LANGUAGE 'plpgsql' IMMUTABLE;
and here’s an update which uses it:
UPDATE my_table SET my_field = rename_jsonb_key(my_field, '{path, to, key}','oldname','newname');