У меня есть два массива, как показано ниже, поскольку я объединяю оба массива - значение ключа ST в Array1
заменяется значениями в ST
значениях ключей в Array2
,
Массив 1:
{"ST": ["Bin", "No", "Comp"], "OSS": ["Class"]}
Массив 2:
{"ST": ["Pro", "SU"]}"
Ожидаемый результат:
{"ST": ["Bin", "No", "Comp","Pro", "SU"], "OSS": ["Class"]}
Как мне этого добиться?
1) Вам необходимо четко указать, с чем вы работаете. Примеры выглядят как объекты JSON с массивами JSON в качестве значения ключа. Это не то же самое, что родной тип Postgres ARRAY . 2) Если это Postgres JSON(B) , то вам нужно прочитать Функции JSON.
Кажется, вопрос в том, чтобы '{"ST": ["Bin", "No", "Comp"]}'::jsonb || '{"ST": ["Pro", "SU"]}'::jsonb
использовать второе значение вместо слияния. Это задокументированное поведение ||
.
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
.
Пожалуйста, просмотрите минимальный воспроизводимый пример. Обновите сообщение реальным кодом, демонстрирующим проблему. Похоже, вы пытаетесь объединить элементы массива в JSON, но в вашем описании это явно не указано.