Postgres 未在 array_agg 查询中返回数据,如下所示

Posted

技术标签:

【中文标题】Postgres 未在 array_agg 查询中返回数据,如下所示【英文标题】:Postgres not returning data on array_agg query as below 【发布时间】:2021-01-14 02:51:11 【问题描述】:

当特定图书馆中没有图书数据时,就会出现问题。考虑以下工作场景。

表名:

--------------------------------
| id |    name     |    owner  |
--------------------------------
|  1 |     ABC     |     A     |
|  2 |     DEF     |     D     |
|  3 |     GHI     |     G     |
--------------------------------

表名:书籍

--------------------------------
| id |    title    |  library  |
--------------------------------
|  a |     xxx     |     1     |
|  b |     yyy     |     1     |
|  c |     zzz     |     2     |
--------------------------------

现在当我进行如下查询时:

SELECT library.name, array_agg(b.title) AS book_list FROM library, 
(SELECT title FROM books WHERE books.library = :library_no) as b 
WHERE library.id = :library_no GROUP BY library.id

查询为库 1 和 2 生成输出,但不为库 3 生成输出。为什么以及如何解决此问题? (在没有图书馆书籍的情况下生成一个空列表)

所需输出:

----------------------
| name |    book_list |
----------------------
|  GHI |            |   # or null
-----------------------

PS:我什至尝试过如下合并:

SELECT library.name, coalesce(array_agg(b.title), ARRAY[]::VARCHAR[]) AS book_list FROM library, 
(SELECT title FROM books WHERE books.library = :library_no) as b 
WHERE library.id = :library_no GROUP BY library.id

Postgres 版本:12

【问题讨论】:

请通过编辑问题添加所需的输出 给你@AkhileshMishra 【参考方案1】:

你应该使用左连接来处理这种情况,如下所示:

select 
    l.name, 
    array_agg(b.title) 
from library l left join books b on l.id=b.library
where l.id=3      -- here you can pass you library ID using :library_no variable
group by l.name

DEMO

【讨论】:

是的,它有效。但是coalesce在没有数据的时候不应该返回一个空数组吗? 它将返回NULL。如果您将使用coalesce,那么它将返回""。实际上NULL 是一样的。 但在我的情况下,在合并的情况下也不会返回任何列 您到底在寻找什么? 使用您的解决方案解决了问题。但不能像上面的“PS”那样通过合并解决问题

以上是关于Postgres 未在 array_agg 查询中返回数据,如下所示的主要内容,如果未能解决你的问题,请参考以下文章

如何删除使用 array_agg postgres 函数生成的重复项

Postgres为连接表的array_agg返回[null]而不是[]

postgres array_agg 错误:无法累积不同维度的数组

我如何联接两个以上的postgres表,并在postgres中将其作为nestedjson获得结果

使用postgres json当键为空时删除行

Postgres 中的数据类型“smallserial”未在 Visual Studio Code 中突出显示