在postgresql中搜索没有循环的数组中的元素

时间:2013-09-12 12:12:55

标签: postgresql

我正在编写一个查询来搜索数组中的元素。使用“for”循环搜索效率不高,因为我的数组有很多元素。因此,查询需要花费大量时间来执行。那么任何人都可以说如何在没有“for”循环的情况下搜索数组中的元素,这应该更快。我必须得到搜索索引

谢谢, Karthika

2 个答案:

答案 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