在IN子句中选择数组值

时间:2016-09-19 01:03:14

标签: sql arrays postgresql

我有一个带有数组字段和以下值的Postgres表 -

enter image description here

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

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

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

2 个答案:

答案 0 :(得分:2)

我期待这样的事情:

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);

这可能是一种简单的方法来实现你想要的东西,但这似乎是你正在尝试的东西。

答案 1 :(得分:0)

根据你的评论:

  

我想检查arrayfield是否包含任何id值

此查询返回field中的数组包含来自同一表(不只是同一行)的任何 id值的所有行:

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

EXISTS表达式中使用ANY构造:

array operators相同:

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

使用重叠运算符&&和简单ARRAY constructor(在简单情况下快于array_agg())。

但我预计这种变体的性能会因大表而恶化,因为组装后的阵列同样会变大。