#arrays #json #postgresql #stored-procedures
Вопрос:
Я пытаюсь добавить массив json или объект в массив json, но array_append всегда вставляет json как строку.
Мой результат таков;
{«{«идентификатор категории»: 8,»имя категории»: «08 конфет»,»is_active»: true, «имя категории»:»Конфета»,»порядок отображения»: 7}»}
но я хочу, чтобы все было так. Чтобы я мог json_decode их в своем коде.
[{«идентификатор категории»:8,»имя категории»: «08 конфет»,»is_active»: true, «имя категории»:»Конфета»,»порядок отображения»: 7}]
вот моя функциональная логика
for all_categories in select * from categories where is_active = '1' loop
show_at_homepage = 0;
for current_subcat in select * from public."V_category_to_sub_category_w_names" where category_id = all_categories.category_id and sub_category_is_active = '1' loop
select * into product_count from public."V_APP_products_w_sub_categories" where sub_category_id = current_subcat.sub_category_id and store_id = get_store_id and is_deleted='0';
if count(product_count) > 0 then
show_at_homepage = 1;
end if;
end loop;
if show_at_homepage = 1 then
select row_to_json(all_categories) into cat_json;
select array_append(my_json_result_array,cat_json) into my_json_result_array;
end if;
end loop;
return my_json_result_array;
Ответ №1:
Вы можете применить array_append
к любому массиву типов данных postgres, в том числе json[]
, но вы не можете применить его к массиву json, который имеет тип json
. В вашем случае вам необходимо применить функции и операторы json, см. Руководство и, более конкретно json_build_array
, функцию :
Заменять
select array_append(my_json_result_array,cat_json) into my_json_result_array
Автор:
select json_build_array(my_json_result_array,cat_json) into my_json_result_array
Или когда вы используете jsonb
вместо json
того, что является рекомендацией руководства :
select jsonb_build_array(my_json_result_array,cat_json) into my_json_result_array
Комментарии:
1. Это хорошо, но я хочу добавить этот массив jsonb в виде массива в my_json_result_array. Я не могу этого сделать. когда я использую array_append, он добавляет cat_json в my_json_result_array_array в виде строки. поэтому, даже если он показывает скобки, как массив, он заключает его в двойные кавычки и становится строкой.
2. Хорошо, посмотрите на обновленный ответ и скажите мне, соответствует ли он вашим потребностям.
3. это было близко, но когда я jsonb_build_array, он вставляется за пределы массива. позвольте мне объяснить. то, что я хочу, похоже на это [//здесь будут добавлены категории в виде массива], но с json_build_array это дает мне что-то вроде [[{категория 1}],категория 2]. я должен добавить его в тот же массив, что и category1
4. Основываясь на вашем последнем комментарии, я возвращаюсь к своему первоначальному ответу :
SELECT '[]' :: jsonb || my_json_result_array :: jsonb || cat_json :: jsonb
вернусь[my_json_result_array , cat_json] :: jsonb
. Если это не отвечает на ваш вопрос, пожалуйста, предоставьте полный набор примеров данных : my_json_result_array, cat_json и ожидаемый результат после объединения.