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

如何在Postgres中选择一列json对象,以便返回的行是数组的json数组?,json,postgresql,jsonb,Json,Postgresql,Jsonb,我有一个带有单个jsonb列的表。如何执行select查询,将每个jsonb行转换为jsonb数组,其中每个项都是另一个数组,第一个索引是键,第二个索引是值?钥匙没有提前知道 使用此查询选择列: 从myTable中选择myRow 返回具有以下jsonb值的行: { "key1": "value1", "key2": "value2", "key3": "value3", "key4": "value4", "key5": "value5" } 我希望输

我有一个带有单个jsonb列的表。如何执行select查询,将每个jsonb行转换为jsonb数组,其中每个项都是另一个数组,第一个索引是键,第二个索引是值?钥匙没有提前知道

使用此查询选择列:

从myTable中选择myRow
返回具有以下jsonb值的行:

{
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": "value4",
    "key5": "value5"
}
我希望输出行如下所示:

[
    ["key1", "value1"],
    ["key2", "value2"],
    ["key3", "value3"],
    ["key4", "value4"],
    ["key5", "value5"]
]
select arr 
from data 
join lateral(
    select jsonb_agg(jsonb_build_array(key, value)) arr 
    from jsonb_each(j)
) sub on true;

  • json\u每个
    将json对象扩展为每个属性一行。它为键创建一列,为值创建一列
  • json\u build\u array
    为每个记录创建内部数组
  • json_agg
    将(2)中的数组聚合为一个大数组

  • S-Man的查询将把原始表中的所有行合并到一个大数组中。你的问题有点不清楚你到底想要不想要。如果希望每一行都有自己的数组,可以执行以下操作:

    [
        ["key1", "value1"],
        ["key2", "value2"],
        ["key3", "value3"],
        ["key4", "value4"],
        ["key5", "value5"]
    ]
    
    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)
    

    你说得对,我应该说得更清楚些。谢谢。true上的
    sub在结尾做了什么?sub只是subselect所需的别名。on true是连接条件,也是必需的,对于此横向连接,该条件应始终为true