PostgreSQL rename attribute in jsonb field

后端 未结 3 950
野性不改
野性不改 2020-11-30 03:39

In postgresql 9.5, is there a way to rename an attribute in a jsonb field?

For example:

{ \"nme\" : \"test\" }

should be renamed t

相关标签:
3条回答
  • 2020-11-30 04:14

    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

    0 讨论(0)
  • 2020-11-30 04:33

    My variable type is json. When i changed it with jsonb, i cant do it, because it depends on to view. Anyway, i fixed it with column_name::jsonb. I wanted to share with people who meet like this problems. Also thanks @klin

    0 讨论(0)
  • 2020-11-30 04:35

    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)
    
    0 讨论(0)
提交回复
热议问题