小编典典

Postgres:使用ARRAY_AGG和HAVING(而不是WHERE)过滤结果

sql

因此,我的数据库包含项目清单:

items:  item.id | item.title

我还有第二张表,该表将一些标签与项目相关联:

tags:  tag.id | item.id

一个项目可能具有与之关联的几个标签(例如5、20和25),因此对于标签表中的每个标签值都有一行。

我希望能够确定某个特定标签是否与某个商品相关联,而又不会丢失所有其他标签数据。例如,

SELECT items.id, items.title
FROM items
INNER JOIN tags ON (tag.tag_id=items.id)
WHERE tag.id =27

不起作用,因为它消除了包含其他标记值的行(如果tag.id为27,则它不能是特定行上的任何其他值)。

为了解决这个问题,我想使用ARRAY_AGG将各个标签号汇总到一个数组中,我可以(应该)轻松地测试其成员资格值。

SELECT items.id, items.title
FROM items
INNER JOIN tags ON (tag.tag_id=items.id)
GROUP BY items.id
HAVING ANY(ARRAY_AGG(tags.tag_id)=27)

但是上面的代码在HAVING子句的ANY部分上产生语法错误。

有什么想法吗?


阅读 216

收藏
2021-04-19

共1个答案

小编典典

事实证明Postgres的ANY关键字是支持关键字的,不能对称使用。

因此,工作代码为:

SELECT items.id, items.title, ARRAY_AGG(tags.tag_id)
FROM items
INNER JOIN tags ON (tag.tag_id=items.id)
GROUP BY items.id
HAVING 27 = ANY(ARRAY_AGG(tags.tag_id))
2021-04-19