PostgreSQL: как при объединении объектов JSON с одинаковыми ключами добавить их значения?

У меня есть два массива, как показано ниже, поскольку я объединяю оба массива - значение ключа ST в Array1 заменяется значениями в ST значениях ключей в Array2,

Массив 1:

{"ST": ["Bin", "No", "Comp"], "OSS": ["Class"]}

Массив 2:

{"ST": ["Pro", "SU"]}" 

Ожидаемый результат:

{"ST": ["Bin", "No", "Comp","Pro", "SU"], "OSS": ["Class"]}

Как мне этого добиться?

Пожалуйста, просмотрите минимальный воспроизводимый пример. Обновите сообщение реальным кодом, демонстрирующим проблему. Похоже, вы пытаетесь объединить элементы массива в JSON, но в вашем описании это явно не указано.

JohnH 05.09.2024 21:03

1) Вам необходимо четко указать, с чем вы работаете. Примеры выглядят как объекты JSON с массивами JSON в качестве значения ключа. Это не то же самое, что родной тип Postgres ARRAY . 2) Если это Postgres JSON(B) , то вам нужно прочитать Функции JSON.

Adrian Klaver 05.09.2024 21:08

Кажется, вопрос в том, чтобы '{"ST": ["Bin", "No", "Comp"]}'::jsonb || '{"ST": ["Pro", "SU"]}'::jsonb использовать второе значение вместо слияния. Это задокументированное поведение ||.

clamp 05.09.2024 22:20
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
3
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

WITH js AS (
    SELECT
        '{"ST": ["Bin", "No", "Comp"], "OSS": ["Class"]}'::jsonb AS js_data
    )
SELECT
    jsonb_set(js_data, '{ST}', 
             jsonb_path_query_array(
                js_data, '($.ST[*])') || '["Pro", "SU"]'::jsonb)
FROM
    js
;

jsonb_set                           
--------------------------------------------------------------
 {"ST": ["Bin", "No", "Comp", "Pro", "SU"], "OSS": ["Class"]}

При этом jsonb_path_query_array используется для извлечения существующего значения массива из "ST", а затем объединяет его с объединяемым массивом (jsonb_path_query_array). Затем jsonb_set заменяет текущий массив, связанный с ключом "ST", новым объединенным массивом, созданным в jsonb_path_query_array. CTE(WITH) используется, чтобы не повторять весь объект jsonb.

Ответ принят как подходящий

Следующее выполнит запрошенную операцию:

WITH demo AS (
    SELECT
      '{"ST": ["Bin", "No", "Comp"], "OSS": ["Class"]}'::jsonb AS array1,
      '{"ST": ["Pro", "SU"]}'::jsonb AS array2
  )
SELECT
  array1 || JSONB_BUILD_OBJECT('ST', (array1 -> 'ST') || (array2 -> 'ST'))
FROM
  demo;

Выражение работает путем создания нового элемента ST из значений объединенного массива из исходных элементов ST, а затем использует преимущества поведения оператора ||, заключающегося в сохранении последнего значения, присвоенного общему именованному элементу, для создания окончательного JSON. Оператор || недопустим для JSON, поэтому необходимо будет привести любые элементы JSON к JSONB.

Другие вопросы по теме