我正在编写一个查询来搜索数组中的元素。使用“for”循环搜索效率不高,因为我的数组有很多元素。因此,查询需要花费大量时间来执行。那么任何人都可以说如何在没有“for”循环的情况下搜索数组中的元素,这应该更快。我必须得到搜索索引
谢谢, Karthika
答案 0 :(得分:1)
使用ANY运算符:
where 1 = ANY (array_column)
这将返回array_column
至少包含值1
的所有行。如果您想检查多个值,请参阅Clodoaldo的回答。
如果在该列上创建索引,则应该非常快。像这样:
create index on the_table using gin (the_array_column);
以下内容的灵感来自此处显示的解决方案:Finding the position of a value in PostgreSQL arrays
with sample_data (pk_column, array_data) as (
values
(1, array[1,2,3,4,5]),
(2, array[7,8,9,11]),
(3, array[5,4,3,2,1]),
(4, array[10,9,8,1,4,6]),
(5, array[7,8,9])
)
select *
from (
select pk_column,
unnest(array_data) as value,
generate_subscripts(array_data, 1) as array_index
from sample_data
where 1 = any(array_data)
) t
where value = 1
内部将减少仅需要对实际包含值的行进行的总工作量。然后外部查询将“爆炸”数组以获取值的索引。但是使用链接问题中显示的功能可能实际上就是你所追求的。
答案 1 :(得分:0)
检查包含运算符@>
select array[1,2] @> array[1];
?column?
----------
t
http://www.postgresql.org/docs/current/static/functions-array.html