2016-05-13 161 views
0

我使用postgres9.4,並存在關係「患者」有列「聯繫」與類型jsonb[],如何轉移類型jsonb[]jsonbpostgres更改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\"}"} 
+0

嘗試'...使用contact4 [1]' –

回答

1

柱如果只使用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); 
0

從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 '[]'