POSTGRESQL多选,多行数组可能吗?

时间:2016-01-09 11:56:34

标签: arrays json postgresql select array-agg

说我做了一些简单的事情,比如从两个表中选择所有内容:

"SELECT * FROM table1; SELECT * FROM table2;"

它将返回一个看起来像的结果对象:

{rows:[{},{},{} etc...]}

行对象数组是table1的每一行,后面是table2的每一行。

我想要的是能够将上述SELECT语句组合到一个数据库查询中,但让它返回如下内容:

[
{table1rows:[{},{},{}]}
,{table2rows:[{},{},{}]}
]

...这样我就可以避免DB的多次查询,然后将每个查询的结果对象捏造成一个自定义对象,我从DB查询引用到DB查询就像一个穴居人。所以一个查询,一个干净的结果集,我可以在客户端知道哪个行来自哪个表。

你可以使用AS吗?如何通过一个查询实现这一目标?

1 个答案:

答案 0 :(得分:1)

你基本上需要:
    - 将{strong> combine multiple queriesUNION ALL一起使用;
    - 使用json_build_objectjson函数构建json_agg数组;

示例SELECT可以是以下内容:

WITH table1(a1,b1) AS ( VALUES
  ('valA1','valB1')
), table2(a2,b2) AS ( VALUES
  ('valA2','valB2')
)
SELECT json_agg(each_table_rows.data) FROM (
  SELECT json_build_object('table1rows',tbl1.*) AS data
  FROM (
    SELECT t1.* FROM table1 t1
  ) tbl1
  UNION ALL
  SELECT json_build_object('table2rows',tbl2.*)
  FROM (
    SELECT t2.* FROM table2 t2
  ) tbl2
) each_table_rows;

结果:

                                           json_agg                                           
----------------------------------------------------------------------------------------------
 [{"table1rows" : {"a1":"valA1","b1":"valB1"}}, {"table2rows" : {"a2":"valA2","b2":"valB2"}}]
(1 row)