2015-07-10 2 views
1

У меня есть столбец типа json с именем «attr», который использовался для хранения списка, включая некоторые dict, например [{"foo":1}, {"foo":2}, {"foo":3}].UPDATE столбец типа json в PostgreSQL

Теперь я хочу расширить список до [{"foo":1}, {"foo":2}, {"foo":3}, {"foo":4}]. Конечно, я могу использовать запрос sql:

update tbl 
set attr='[{"foo":1}, {"foo":2}, {"foo":3}, {"foo":4}]'::json; 

Однако мне нужно выполнить его на своем веб-сервере. Поэтому я должен выбрать прежнее значение, расширить список и затем обновить его в таблице.

Я думаю, если есть способ использовать некоторые функции PostGreSQL сделать это как array_to_json или json_array_elements

Я написал этот вопрос:

update tbl 
set attr = json_build_array(json_array_elements(attr), '{"foo":4}'::json); 

Но он получил неправильный результат.

ответ

1

Для типа данных json:

UPDATE tbl 
SET attr = (
    SELECT json_agg(elem) 
    FROM (
     SELECT elem 
     FROM json_array_elements(attr) elem 
     UNION ALL 
     SELECT '{"foo":4}'::json 
    ) sub 
    ) 
WHERE tbl_id = 123; -- determine row to update 

Для типа данных jsonb:

UPDATE tbl 
SET attr = (
    SELECT json_agg(elem)::jsonb 
    FROM (
     SELECT elem 
     FROM jsonb_array_elements(attr) elem 
     UNION ALL 
     SELECT '{"foo":4}'::jsonb 
    ) sub 
    ) 
WHERE tbl_id = 123; 

Совокупная функция json_agg() всегда возвращает json, даже при вызове с jsonb входом. Поэтому нам нужен еще один актер до jsonb.

Очевидно, что вы хотите ограничить свой UPDATE определенной строкой, поэтому добавьте пункт WHERE.

Не переходите в базовую таблицу второй раз в подзапрос, просто работайте со значением из целевой строки.

+0

Спасибо за ваш ответ! Это мне очень помогает! – PikeSZfish

Смежные вопросы