Postgres使用AND条件将所有数组值匹配到同一列

5
我有一个名为table_a的表格,包含以下列:
id  event_id
1   101
1   102
1   103
2   105
2   103
2   106

我需要搜索 (101, 103) 且条件类似于带有 OR 条件的 IN 查询。

例如,ID 1 匹配了 101 和 103 的 event_id;

为此,我编写了以下查询,但它不起作用。

select * from table_a where event_id = ALL(ARRAY[101,103]);

更新--------------------------------

我还有另一个问题。

假设id是另一张表event_categories的外键,关系如下。

id      parent_id
101     null
102     101
103     101
104     null
105     104

我希望基于父事件类别的AND以及子事件类别的OR从table_a中获取记录。

例如,101、104为AND,102、103在101的OR范围内。


如果您有一个新问题,请提出一个新的问题(并标记其中一个答案为已接受,以便将此问题标记为已解决)。 - user330315
@a_horse_with_no_name 添加了一个新问题 链接 - Vivek Kumar Singh
2个回答

10
你需要对单个ID汇总所有事件ID:
select id
from table_a
group by id
having array_agg(event_id) @> array[101,103];
@=是包含运算符,因此它检查所有event_ids数组是否包含包含这两个ID的数组。

这将返回任何具有至少两个事件101和103的ID(这是您在问题中要求的内容)。

如果您想找到那些恰好具有这两个事件id的ID(您的示例数据不包含),可以使用:

select id
from table_a
group by id
having array_agg(distinct event_id order by event_id) = array[101,103];

请注意,对于=运算符,数组中元素的顺序很重要(不像“包含”@>运算符)。


感谢详细的解释。 - Vivek Kumar Singh

2
使用HAVING子句:
SELECT t.id 
FROM YourTable
WHERE event_id IN(101,103)
GROUP BY t.id
HAVING COUNT(distinct event_id) = 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接