PostgreSQL json (b) - преобразовать строку в массив и обновить поле

У меня есть поле jsonb в PostgreSQL со следующим содержимым:

{ "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 -> text -> array -> json. Предложения приветствуются)

Но как мне теперь обновить поле urls массивом json? Наверное, придется использовать jsonb_set?


person mxlse    schedule 05.01.2017    source источник


Ответы (1)


Используйте 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) 
person klin    schedule 05.01.2017
comment
Это сработало. Мне просто нужно было добавить WHERE jdata->'object'->'urls' IS NOT NULL. В противном случае эти строки имели значение null как json (или jdata в вашем случае). - person mxlse; 05.01.2017