我有一个表,其中包含像这样的数组中的值。如何在Postgres中查询数组存储列(数组相交)
id | contents_id
1 | [1, 3, 5]
2 | [1, 2]
3 | [3, 4, 6]
4 | [2, 5]
如何编写查询数组例如[1, 2]
这样它检查整个数组而不是数组的值?
如果找到任何常见的数组值,则获取所有元组。
如果[1, 2]
被查询,因为它包含1
或2
它必须从上述表中提取id
=>1, 2, 4
。
我有一个表,其中包含像这样的数组中的值。如何在Postgres中查询数组存储列(数组相交)
id | contents_id
1 | [1, 3, 5]
2 | [1, 2]
3 | [3, 4, 6]
4 | [2, 5]
如何编写查询数组例如[1, 2]
这样它检查整个数组而不是数组的值?
如果找到任何常见的数组值,则获取所有元组。
如果[1, 2]
被查询,因为它包含1
或2
它必须从上述表中提取id
=>1, 2, 4
。
在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]);
考虑使用intarray扩展。它提供了一个用于测试整数数组重叠的运算符。 Here是一个小提琴,举一个例子。
select id from test where ARRAY[1,2] && contents_id;
虽然你可以用运算符来查询它,但我认为用整数ID做一个结点表会更好。
我应该添加'intarray'扩展名吗?分开来查询这种方式?很高兴在小提琴中看到工作代码。感谢那。 –
如果尚未添加,则必须在服务器上创建它。你可以看到如何在小提琴的代码中做到这一点。我已经评论过它,因为它已经安装在这些服务器上。 –