2017-01-05 44 views
1

我有一个jsonb场PostgreSQL中有以下内容:PostgreSQL的JSON(二) - 转换字符串数组和更新领域

{ "object": { "urls": "A;B;C" } }

我想要做的就是更新urls值在对象内部并用分号分隔的值将字符串转换为JSON数组。所以结果应该是这样的:

{ "object" : { "urls": ["A", "B", "C"] } }

我发现了如何获得一个JSON阵列。使用

to_json(string_to_array(replace((json->'object'->'urls')::text, '"',''), ';'));

给我["A", "B", "C"](我想应该有这样做没有转换JSON的一种更好的方式 - >正文 - >排列 - > JSON建议,欢迎)

但我现在如何使用json数组更新urls字段?可能我必须使用jsonb_set

回答

2

使用jsonb和功能jsonb_set()

create table my_table(id int primary key, jdata jsonb); 
insert into my_table values 
(1, '{ "object": { "urls": "A;B;C" } }'); 

update my_table 
set jdata = jsonb_set(
     jdata, 
     array['object', 'urls'], 
     to_jsonb(string_to_array(replace((jdata->'object'->'urls')::text, '"',''), ';')) 
     ) 
returning *; 

id |    jdata     
----+------------------------------------- 
    1 | {"object": {"urls": ["A", "B", "C"]}} 
(1 row) 
+0

它运作良好。我只需要添加'WHERE jdata - >'object' - >'urls'不是NULL'。否则,这些行的空值为json(或者在你的情况下为jdata)。 – mxlse