合并具有相同键的 JSON 对象时,如何附加它们的值?

问题描述 投票:0回答:2

我有两个数组,如下所示,因为我连接了两个数组 -

Array1
中的 ST 键值被
ST
中的
Array2
键值中的值替换,

阵列1:

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

数组2:

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

预期输出:

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

我如何实现这一目标?

json postgresql merge
2个回答
0
投票

以下将执行请求的操作:

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


0
投票
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
对象。

© www.soinside.com 2019 - 2024. All rights reserved.