2

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

谢谢, 卡西卡

4

2 回答 2

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

内部 where 会将需要完成的总工作减少到仅那些实际包含该值的行。然后外部查询将“分解”数组以获取值的索引。但是使用链接问题中显示的功能实际上可能是您所追求的。

于 2013-09-12T12:19:13.207 回答
0

检查包含运算符@>

select array[1,2] @> array[1];
 ?column? 
----------
 t

http://www.postgresql.org/docs/current/static/functions-array.html

于 2013-09-12T12:19:44.077 回答