postgresql 使用IN子句选择数组值

b4wnujal  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(2)|浏览(307)

我有一个Postgres表,其中包含数组字段和以下值:

我想提取所有在field列中具有id值的行,下面是我尝试的查询(现在使用表别名简化):

SELECT tb1."id",
       tb1."field",
       tb1."field1"
FROM "polls_nullableintegerarraymodel" tb1
WHERE tb1."field" IN (ARRAY[tb1."id"])

但由于某种原因,它并没有拉动值。

wj8zmpe1

wj8zmpe11#

我期待这样的东西:

SELECT am."id", am."field", am."field1"
FROM "polls_nullableintegerarraymodel" am
WHERE am."id" = ANY(am."field");

另外,请注意表别名如何使查询更易于写入和读取。
编辑:
下面是显示此工作的示例代码:

with t as (
      select 1 as id, '{2}'::integer[] as field1 union all
      select 2 as id, '{1, 2}':: integer[] as field1
     )
select *
from t
where id = any(field1);

这只返回第二行。
编辑II:
你似乎想要这个:

SELECT tb1."id", tb1."field", tb1."field1"
FROM "polls_nullableintegerarraymodel" tb1
WHERE tb1."field" <@ (SELECT array_agg("id") FROM tb1);

这可能是一个简单的方法来完成你想要的,但这似乎是你正在尝试的。

v8wbuo2f

v8wbuo2f2#

根据您的评论:
我想检查arrayfield是否包含任何id值
此查询返回所有行,其中field中的数组包含来自同一个表的 anyid值(不仅仅是同一行):

SELECT *
FROM   polls_nullableintegerarraymodel p1
WHERE  EXISTS (
   SELECT 1
   FROM   polls_nullableintegerarraymodel p2
   WHERE  p2.id = ANY(p1.field)
   );

EXISTS表达式中使用ANY构造:

  • 如何在WHERE子句中使用ANY代替IN?

array operators相同:

SELECT *
FROM   polls_nullableintegerarraymodel p1
WHERE  field && (ARRAY(SELECT id FROM polls_nullableintegerarraymodel));

使用重叠运算符&&和一个简单的ARRAY构造函数(在简单情况下比array_agg()快)。
但我预计这个变体的性能会随着大表而恶化,因为组装的数组会变得同样大。

相关问题