为每列返回数组(一个查询命令)

yftpprvb  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(139)

这是我的People表,我希望为每列获取一个数组作为输出。
| 姓名|姓|
| - -|- -|
| 单元格1|单元4|
| 单元2|单元5|
| 单元3|空值|

SELECT array_agg(name) AS names FROM people

我只知道如何从表中返回一个数组,但我希望每个列都有一个数组,而不需要任何表达式(比较)。
我在寻找一个结果,像下面这样:
((Cell1, Cell2, Cell3), (Cell4, Cell5))
使用不同的表而不是列也是可以的。

SELECT array_agg(name) FROM name
SELECT array_agg(surname) FROM surname
goucqfw6

goucqfw61#

首先是:((Cell1, Cell2, Cell3), (Cell4, Cell5))不是SQL数组的正确表示法。
{{Cell1, Cell2, Cell3}, {Cell4, Cell5}}是文本数组的正确表示法,但您会得到sql错误 “多维数组必须具有维数匹配的子数组”,因为第一个子数组的维数为3,而第二个子数组的维数为2,这是sql数组不接受的。
所以这里有两个解决方案:

解决方案1:包括NULL值,以便两个子数组具有相同的维数:

SELECT array(SELECT array_agg(name) FROM people_table UNION ALL SELECT array_agg(surname) FROM people_table) ;

结果的类型为text[]
| 数组|
| - -|
| {{“单元格1”,“单元格2”,“单元格3”},{“单元格4”,“单元格5”,空}}|

解决方案2:用json数组替换SQL数组,该json数组接受具有各种维度的子数组,同时排除surname列的NULL值:

SELECT json_build_array(array_agg(name), array_agg(surname) FILTER (WHERE surname IS NOT NULL)) AS array FROM people_table ;

结果的类型为json
| 数组|
| - -|
| [[“单元格1”,“单元格2”,“单元格3”],[“单元格4”,“单元格5”]]|
最后但并非最不重要的一点是,当姓名来自两个不同的表时:

-- warning: both sub queries must return the same number of rows !
SELECT array(SELECT array_agg(name) FROM name UNION ALL SELECT array_agg(surname) FROM surname) ;

-- notice: both sub queries may return different numbers of rows
SELECT json_build_array((SELECT to_json(array_agg(name)) FROM name), (SELECT to_json(array_agg(surname)) FROM surname WHERE surname IS NOT NULL)) AS array  ;

相关问题