Не удается добавить массив json в массив json в функции postgresql

#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 и ожидаемый результат после объединения.