我有一个带有数组字段和以下值的Postgres表 -
我想在id
列中提取field
值的所有行,这是我尝试的查询(现在使用表别名简化):
SELECT tb1."id",
tb1."field",
tb1."field1"
FROM "polls_nullableintegerarraymodel" tb1
WHERE tb1."field" IN (ARRAY[tb1."id"])
但出于某种原因,它并没有拉动价值。
答案 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()
)。
但我预计这种变体的性能会因大表而恶化,因为组装后的阵列同样会变大。