【问题标题】:POSTGRESQL multiple select, multiple row arrays possible?POSTGRESQL 多选,多行数组可能吗?
【发布时间】:2016-04-14 02:04:18
【问题描述】:

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

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

它将返回一个结果对象,如下所示:

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

其中行对象数组是来自table1 的每一行,然后是来自table2 的每一行。

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

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

...这样我就可以避免数据库的多个查询,然后将每个查询的结果对象伪造为我从数据库查询引用到数据库查询的自定义对象,就像一个穴居人。因此,我可以在客户端处理一个查询,一个干净的结果集,知道哪个行数组来自哪个表。

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

【问题讨论】:

  • 您可以使用UNION ALL 来组合两次选择的结果。但是从两个表中选择每一列和每一行听起来不是一个好主意。
  • 我不会选择现实中的所有行,但为了便于阅读,我把那部分省略了......
  • 您还忽略了食物链的哪一部分将输出格式化为 JSON 数组,因为 Postgres 不会为普通的 SELECT 执行此操作。您可以让 Postgres 输出 JSON,但您的未命名软件将在另一次嵌套。

标签: arrays json postgresql select array-agg


【解决方案1】:

您基本上需要:
- 使用 combine multiple queriesUNION ALL;
- 使用json_build_objectjson_agg 函数构建json 数组;

例如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)

【讨论】:

    猜你喜欢
    • 2013-01-06
    • 1970-01-01
    • 2018-06-16
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    相关资源
    最近更新 更多