我有两个数组,如下所示,因为我连接了两个数组 -
Array1
中的 ST 键值被 ST
中的 Array2
键值中的值替换,
阵列1:
{"ST": ["Bin", "No", "Comp"], "OSS": ["Class"]}
数组2:
{"ST": ["Pro", "SU"]}"
预期输出:
{"ST": ["Bin", "No", "Comp","Pro", "SU"], "OSS": ["Class"]}
我如何实现这一目标?
以下将执行请求的操作:
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
。
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
对象。