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 错误:无法累积不同维度的数组