当前位置: 首页 > 面试题库 >

Postgres使用条件将所有数组值匹配到同一列---已更新

司空俊雅
2023-03-14
问题内容

我有带有以下列的表table_a

id  event_id
1   101
1   102
1   103
2   105
2   103
2   106

I和要搜索(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从table_a中获取记录。

例如101、104和101的OR之内为AND 102、103


问题答案:

您需要为一个ID汇总所有event_id:

select id
from table_a
group by id
having array_agg(event_id) @> array[101,103];

@>是操作者包含所以它会检查是否所有的event_ids数组包含与这两个ID的数组。

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

如果你想找到那些有ID的 正是 这两个event_ids(其中您的样本数据中不包含),你可以使用:

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

请注意,数组中元素的顺序对=运算符很重要(与“ contains”@>运算符不同)



 类似资料:
  • 我试图将一个数组的值添加到一个已经存在的数组中,该数组已经有一个值。我的方法是创建一个新的数组,其长度为已有数组的长度+我要添加的值的长度。然后,我只需循环整个数组,并将值添加到新数组的索引中。我的方法如下所示: null 我想不出解决办法

  • 我正在使用SpringMVC4和EclipseLink 2.5开发一个web应用程序。Windows 7中的0和MySQL 5.6。我使用criteria(criteria Builder和CriteriaQuery)从数据库中获取所有字段的总和。我想要实现的是本机MySQL中与此语句等价的内容。 注:che_monto是一个数字(10,2)字段。 我遇到的问题是,在一些教程中没有说明如何实现这一

  • 我一定错过了什么。我正在计算一个列表,想跳过特定的数字,所以我做了一个switch语句: 以下是输出: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25 26 27 28 29 30 32 33 34 35 36 37 38 39 40 41 42 44 45 46 47 48 50 52 53 注意,44出现了,尽管我没

  • 我有两个表表1(col1,col2,col3,col4)和表2(çol1,col2,col5)。 表1 col3是空的,我想根据表1(col1, col2)和表2(col1, col2)的匹配更新表2 col5的数据。

  • 问题内容: 我正在尝试编写一个查询,仅当用户打开的活动声明不超过两个时,才将“声明”表中的行更新为活动状态。因此,它是用于数据的完整性非常重要的是,用户 永远 有两个以上的主动要求在任何给定的时间打开。 我在并发环境中运行此查询,因此两个进程可能同时执行此查询。我也在默认隔离级别下运行它。 我想知道是否由于子选择和更新子句之间的竞争条件而在某个时候打开一个用户有两个以上的主动声明的可能性。 值得一

  • 问题内容: 我正在使用MySQL包含以下各列的表: 表中的数据如下所示: 要查询它,我可以轻松地做到这一点: 结果将是: 我想知道是否有办法做到这一点: 我想在表达式中使用表列,而无需实际手动指定名称(将其键入)。 奖励(+1)问题 : 能否使用Match / Against像这样完成: 谢谢你的时间!:) 问题答案: 您必须使用Prepared Statement,因为您要执行的操作只能通过动态