【问题标题】:Converting postgres string column to json将postgres字符串列转换为json
【发布时间】:2018-07-26 21:16:38
【问题描述】:

我有一个用户表,我想将字符串列 foo 转换为带有 {"oldfield": } 的 json,但我似乎找不到正确的语法。我是直接用psql命令行界面的。

这是我尝试过的:

 ALTER TABLE user_schema.user ALTER COLUMN "foo" SET DATA TYPE json USING '{"oldfield": "foo"}';

这会将字段完全更改为 {"oldfield":"foo"},而不是 foo 列的实际值。我还尝试了以下组合,所有组合都因语法错误而失败。有任何想法吗?谢谢

   ALTER TABLE user_schema.user ALTER COLUMN "foo" SET DATA TYPE json USING '{"oldfield": foo}';
ERROR:  invalid input syntax for type json
DETAIL:  Token "foo" is invalid.
CONTEXT:  JSON data, line 1: {"oldfield": foo...

 ALTER TABLE user_schema.user ALTER COLUMN "foo" SET DATA TYPE json USING '{"oldfield": \"foo\"}';
ERROR:  invalid input syntax for type json
DETAIL:  Token "\" is invalid.
CONTEXT:  JSON data, line 1: {"oldfield": \...
ALTER TABLE user_schema.user ALTER COLUMN "foo" SET DATA TYPE json USING '{"oldfield": 'foo'}';
ERROR:  syntax error at or near "foo"
LINE 1: ...Metadata" SET DATA TYPE json USING '{"oldfield": 'foo...
                                                             ^
ALTER TABLE user_schema.user ALTER COLUMN "foo" SET DATA TYPE json USING '{"oldfield": `foo`}';
ERROR:  invalid input syntax for type json
DETAIL:  Token "`" is invalid.
CONTEXT:  JSON data, line 1: {"oldfield": `...
 ALTER TABLE user_schema.user ALTER COLUMN "foo" SET DATA TYPE json USING '{"oldfield": user.foo}';
ERROR:  invalid input syntax for type json
DETAIL:  Token "user" is invalid.
CONTEXT:  JSON data, line 1: {"oldfield": user...
ALTER TABLE user_schema.user ALTER COLUMN "foo" SET DATA TYPE json USING '{"oldfield": user_schema.user.foo}';
ERROR:  invalid input syntax for type json
DETAIL:  Token "user_schema" is invalid.
CONTEXT:  JSON data, line 1: {"oldfield": user_schema...
ALTER TABLE user_schema.user ALTER COLUMN "foo" SET DATA TYPE json USING '{"oldfield": foo}';
ERROR:  invalid input syntax for type json
DETAIL:  Token "foo" is invalid.

【问题讨论】:

    标签: sql json postgresql database-migration


    【解决方案1】:

    使用函数json_build_object():

    create table my_table(foo text);
    insert into my_table values
        ('first'),
        ('second');
    
    alter table my_table 
        alter column foo set data type json 
        using json_build_object('oldfield', foo);
    
    select *
    from my_table;
    
               foo           
    -------------------------
     {"oldfield" : "first"}
     {"oldfield" : "second"}
    (2 rows)    
    

    【讨论】:

    • 谢谢你,做到了。如果表在模式中,这是我的语法(不幸的是,我花了 5 分钟才弄清楚,但也许我只是不习惯 sql 语法以及何时引用/引用表......): ALTER TABLE user_schema .user ALTER COLUMN "Foo" SET DATA TYPE json USING json_build_object('oldfield', "Foo");
    • 感谢您的回答。这对我很有用。
    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2016-10-14
    • 2018-06-28
    • 2020-05-23
    相关资源
    最近更新 更多