如何在Postgres中查询数组存储列,(数组交集)

时间:2017-07-31 04:35:47

标签: sql arrays postgresql

我有一个表格,其中包含数组中的值。

id | contents_id
 1 | [1, 3, 5]
 2 | [1, 2]
 3 | [3, 4, 6]
 4 | [2, 5]

如何编写查询数组,例如[1, 2]使得它检查数组的值不是整个数组?

如果找到任何常见的数组值,则获取所有元组。

如果查询[1, 2],则必须提取id =>来自上表的1, 2, 4,因为它包含12

2 个答案:

答案 0 :(得分:2)

考虑使用intarray扩展。它提供了一个&&运算符用于测试整数数组重叠。 Here是一个小提琴,有一个例子。

select id from test where ARRAY[1,2] && contents_id;

虽然您可以使用运算符查询它,但我认为最好使用整数ID创建联结表。

答案 1 :(得分:1)

在1-D int数组&&运算符arrayoverlap是@LaposhasúAcsa建议的最快。

所以,只有当arrayoverlap不可用或想要使用除一维整数数组之外的任何其他内容时,我的答案才会成立。

检查UNNEST https://www.postgresql.org/docs/current/static/functions-array.html

CREATE TABLE t45407507 (
   id SERIAL PRIMARY KEY 
  ,c int[]
);
insert into t45407507 ( c) values
    (ARRAY[1,3,5])
  , (ARRAY[1,2])
  , (ARRAY[3,4,6])
  , (ARRAY[2,5]);

select DISTINCT id from 
  (SELECT id,unnest(c) as c
  from t45407507) x 
where x.c in (1,2);

可以使用LATERAL加入

缩短
select DISTINCT id from
   t45407507 x,unnest(c) ec
where ec in (1,2);

FROM子句中的逗号(,)是CROSS JOIN的简短符号。 对于LATERAL等表函数,会自动假定unnest()

重写WHERE以使用ARRAY作为参数

SELECT DISTINCT id FROM
  t45407507 x,unnest(c) ec
WHERE ec = ANY(ARRAY[1,2]);