PSQL查询生成值作为具有相同唯一ID的json的json数组的数组

时间:2017-12-12 05:32:41

标签: sql json postgresql

我正在尝试在表中生成PSQL查询,该表具有id,description和session_unique_id等值。我想选择像一组json数组的数据,每个数组都有相同session_unique_id的每一行的json数据。

我期待这样的结果。

[
 [
  {"id":"1","description":"test","session_unique_id":"123"},
  {"id":"2","description":"test","session_unique_id":"123"},
  {"id":"3","description":"test","session_unique_id":"123"}
 ],
 [
  {"id":"4","description":"test","session_unique_id":"124"},
  {"id":"5","description":"test","session_unique_id":"124"},
  {"id":"6","description":"test","session_unique_id":"124"}],
 [
  {"id":"7","description":"test","session_unique_id":"125"},
  {"id":"8","description":"test","session_unique_id":"125"},
  {"id":"9","description":"test","session_unique_id":"125"}
 ]
]

2 个答案:

答案 0 :(得分:1)

使用to_jsonb()将行转换为jsonb和jsonb_agg()两次以聚合嵌套数组中的数据:

select jsonb_agg(unique_id order by session_unique_id)
from (
    select session_unique_id, jsonb_agg(to_jsonb(t)) as unique_id
    from my_table t
    group by session_unique_id
    ) t;

在此测试:SqlFiddle.

答案 1 :(得分:0)

如果您使用的是Oracle 12.2,则可以本机执行:

WITH yourtable
     AS (SELECT '1' id, 'test' description, '123' session_unique_id FROM DUAL
         UNION ALL
         SELECT '2' id, 'test' description, '123' session_unique_id FROM DUAL
         UNION ALL
         SELECT '3' id, 'test' description, '123' session_unique_id FROM DUAL
         UNION ALL
         SELECT '4' id, 'test' description, '124' session_unique_id FROM DUAL
         UNION ALL
         SELECT '5' id, 'test' description, '124' session_unique_id FROM DUAL
         UNION ALL
         SELECT '6' id, 'test' description, '124' session_unique_id FROM DUAL
         UNION ALL
         SELECT '7' id, 'test' description, '125' session_unique_id FROM DUAL
         UNION ALL
         SELECT '8' id, 'test' description, '125' session_unique_id FROM DUAL
         UNION ALL
         SELECT '9' id, 'test' description, '125' session_unique_id FROM DUAL)
SELECT json_arrayagg (obj) yourFinalJSON
  FROM (SELECT json_arrayagg (obj) obj
          FROM (SELECT json_object ('id'     value id,
                    'description' value description,
                    'session_unique_id' value session_unique_id
                ) obj
FROM yourtable) t
group by  json_value(t.obj,'$.session_unique_id'))t

只需用您的表替换内联视图。