如何在Postgres中选择一列json对象,以便返回的行是数组的json数组?

时间:2019-07-01 15:55:37

标签: json postgresql jsonb

我有一个带有单个jsonb列的表。如何执行将每个jsonb行转换为一个jsonb数组的选择查询,其中每个项目都是另一个数组,第一个索引为键,第二个索引为值?密钥未知。

使用该查询选择列:

SELECT myRow FROM myTable

返回具有以下jsonb值的行:

{
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": "value4",
    "key5": "value5"
}

我希望输出行看起来像这样:

[
    ["key1", "value1"],
    ["key2", "value2"],
    ["key3", "value3"],
    ["key4", "value4"],
    ["key5", "value5"]
]

2 个答案:

答案 0 :(得分:1)

step-by-step demo:db<>fiddle

SELECT
    json_agg(arr)
FROM
    my_table,
    json_each(my_row),
    json_build_array(key, value) as arr
  1. json_each将每个属性的json对象扩展为一行。它为键创建一列,为值创建一列。
  2. json_build_array为每个记录创建内部数组
  3. json_agg将(2)中的数组聚合为一个巨大的数组。

答案 1 :(得分:1)

S-Man的查询会将原始表中的所有行合并为一个大数组。从您的问题中尚不清楚这是否是您想要的。如果您希望每一行都有自己的数组,则可以执行以下操作:

select arr 
from data 
join lateral(
    select jsonb_agg(jsonb_build_array(key, value)) arr 
    from jsonb_each(j)
) sub on true;

下面是一个使用CTE数据的示例:

with data(j) as (
  select '{
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": "value4",
    "key5": "value5"
  }'::jsonb 
  UNION select '{"key6": "value6"}'
)
select arr 
from data 
join lateral(
  select jsonb_agg(jsonb_build_array(key, value)) arr 
  from jsonb_each(j)
) sub on true;
                                                 arr
------------------------------------------------------------------------------------------------------
 [["key6", "value6"]]
 [["key1", "value1"], ["key2", "value2"], ["key3", "value3"], ["key4", "value4"], ["key5", "value5"]]
(2 rows)