2015-09-26 2 views
0

Im, используя Postgres, и у меня есть столбец JSON, то есть фактически содержащий 2D структуру, например, содержание в этой колонкеколичество строк столбца JSon в PostgreSQL

[ 
    {"in_id":1,"item":"Firsty"}, 
    {"in_id":2,"item":"Second"}, 
    {"in_id":3,"item":"Third"} 
] 

Хочу добавить новый строка в этот формат JSON колонок "Fourth" поэтому после обновления это должна быть как

[ 
    {"in_id":1,"item":"Firsty"}, 
    {"in_id":2,"item":"Second"}, 
    {"in_id":3,"item":"Third"}, 
    {"in_id":4,"item":"Fourth"} 
] 

хочет получить общее количество строк в этой колонке, а затем увеличить его на 1, а затем обновить его с текстом Fourth

любые идеи?

+0

Postgres в настоящее время не имеет такой функциональности коробки. Вы можете использовать язык PLV8 с javascript. Можете ли вы использовать вторую таблицу в качестве таблицы подробностей? – Skoffer

ответ

0

Установка:

create table json_test (id int primary key, val json); 
insert into json_test values 
(1, 
'[ {"in_id":1,"item":"Firsty"}, 
    {"in_id":2,"item":"Second"}, 
    {"in_id":3,"item":"Third"}]'); 

Использование json_array_elements() и json_agg().

with base_query as (
    select json_array_elements(val) elements 
    from json_test 
    where id = 1 
    ), 
union_query as (
    select elements::text 
    from base_query 
    union 
    select '{"in_id":' || count(*)+ 1 || ',"item":"Fourth"}' 
    from base_query 
    ) 
update json_test 
set val = 
    (select json_agg(elements::json) 
    from union_query) 
where id = 1; 

Результат:

select * from json_test; 

id |               val              
----+--------------------------------------------------------------------------------------------------------------------- 
1 | [{"in_id":1,"item":"Firsty"}, {"in_id":2,"item":"Second"}, {"in_id":3,"item":"Third"}, {"in_id":4,"item":"Fourth"}] 
(1 row) 
Смежные вопросы