【问题标题】:Join two Json arrays to one with key and value postgresql使用 postgresql 键和值将两个 Json 数组合并为一个
【发布时间】:2021-05-06 06:43:42
【问题描述】:

我有两个 jsonb 列(键、值)。例如:键列值 = ["key1","key2","key3","key4"] 值列 = ["val1","val2","val3","val4"]

我想编写一个选择查询,根据数组索引得到如下输出。

{"key1":"val1","key2":"val2","key3":"val3","key4":"val4"}

问题是数组大小不会固定。每行包含不同的大小。但是键和值的列大小将始终相同。

【问题讨论】:

标签: sql json postgresql jsonb


【解决方案1】:

您正在寻找的是用于分解 JSON 的 json_array_elements 函数和用于重新压缩它们的 json_agg

我复制了你的案例

create table jsonb_test (a jsonb, b jsonb);
insert into jsonb_test values ('["key1","key2","key3","key4"]','["val1","val2","val3","val4"]');

解决问题的查询是

with row_tbl as (
select 
 replace(cast(json_array_elements(a::json) as varchar),'"','') k, 
 replace(cast(json_array_elements(b::json) as varchar),'"','') v
from jsonb_test)

select json_agg(
json_build_object(k,v)) as complete_json
from row_tbl
;

【讨论】:

    【解决方案2】:

    step-by-step demo:db<>fiddle

    SELECT
        json_object_agg(                                       -- 3
            keys ->> gs,                                       -- 2
            vals -> gs                                         
        )
    FROM 
        mytable,
        generate_series(0, json_array_length(keys) - 1) as gs  -- 1
    
    1. 创建索引以访问数组元素。为此:计算键 (json_array_length()) 的元素并生成索引系列。
    2. 现在您可以使用创建的索引来访问keysvalues
    3. 通过聚合提取的键/值对创建新的 JSON 对象

    【讨论】:

      猜你喜欢
      • 2019-08-30
      • 2011-10-18
      • 1970-01-01
      • 2019-01-06
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      相关资源
      最近更新 更多