【问题标题】:How do I SELECT a column of json objects in Postgres so that the rows returned are json arrays of arrays?如何在 Postgres 中选择一列 json 对象,以便返回的行是 json 数组?
【发布时间】:2019-11-12 06:59:01
【问题描述】:

我有一个带有单个 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"]
]

【问题讨论】:

    标签: json postgresql jsonb


    【解决方案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) 中的数组聚合成一个巨大的数组。

    【讨论】:

      【解决方案2】:

      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)
      

      【讨论】:

      • 你是对的,我应该更清楚。谢谢。
      • sub on true最后做了什么?
      • sub 只是子选择所需的别名。 on true 是连接条件,也是必需的,对于这个横向连接应该始终为真
      猜你喜欢
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多