postgres将jsonb []更改为jsonb

时间:2016-05-13 11:12:17

标签: postgresql postgresql-9.4

我使用postgres9.4,并且存在关系“患者”列表“联系”类型jsonb[],如何将类型jsonb[]转移到jsonb

以下内容正在记录中。

=>select name, contact from "Patients" where contact is not null;

name  |                                               contact                                               
--------+-----------------------------------------------------------------------------------------------------
"tom" | {"{\"name\": \"tom\", \"phone\": \"111111\", \"address\": \"shanghai\", \"relation\": \"your_relation\"}"}

我尝试了以下操作,contact4是类型jsonb

的列
alter table "Patients" alter column contact4 type jsonb using contact4::text::jsonb;

ERROR:  invalid input syntax for type json
DETAIL:  Expected ":", but found "}".
CONTEXT:  JSON data, line 1: ...ress\": \"shanghai\", \"relation\": \"your_relation\"}"}

2 个答案:

答案 0 :(得分:2)

如果只使用jsonb数组的第一个元素,那么问题很简单:

alter table "Patients" alter column contact type jsonb using contact[1]::jsonb;

否则您可以使用以下功能:

create or replace function jsonb_array_to_jsonb(jsonb[])
returns jsonb language sql as $$
    select jsonb_object_agg(key, value)
    from unnest($1), jsonb_each(unnest)
$$;

alter table "Patients" alter column contact type jsonb using jsonb_array_to_jsonb(contact);

答案 1 :(得分:2)

从9.5版本开始,为了保存数据并将数据保存在json中,这样可以更好地工作。

ALTER TABLE "Patients"  ALTER COLUMN "contact" DROP DEFAULT
ALTER TABLE "Patients"  ALTER COLUMN "contact" TYPE jsonb USING to_json(contact)
ALTER TABLE "Patients"  ALTER COLUMN "contact" SET DEFAULT '[]'