在与给定子数组

时间:2015-11-30 20:52:09

标签: sql arrays postgresql function

鉴于此表:

CREATE TABLE datasets.travel(path integer[], path_timediff double precision[]);

INSERT INTO datasets.travel
VALUES (array[50,49,49,49,49,50], array[NULL,438,12,496,17,435]);

我在PostgreSQL中寻找某种函数或查询,对于给定的输入array[49,50],将在path中找到匹配的连续索引值[5,6]和相应的元素在path_timediff中,示例中为435(数组索引6)。

我的最终目的是在[49,50]path中的所有相应元素中查找path_timediff的所有此类事件。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

假设您的表中有一个主键,则表示您没有显示:

CREATE TABLE datasets.travel (
  travel_id     serial PRIMARY KEY
, path          integer[]
, path_timediff float8[]
);

以下是LATERAL加入中generate_subscripts()的一种方式:

SELECT t.travel_id, i+1 AS position, path_timediff[i+1] AS timediff
FROM  (SELECT * FROM datasets.travel WHERE path @> ARRAY[49,50]) t
     , generate_subscripts(t.path, 1) i
WHERE  path[i:i+1] = ARRAY[49,50];

这会找到 所有 匹配项,而不仅仅是第一项。

i+1适用于长度为2的子数组。使用i + array_length(sub_array, 1) - 1进行推广。

子查询不是绝对必要的,但可以使用(path)上的GIN索引进行快速预选:

(SELECT * FROM datasets.travel WHERE path @> ARRAY[49,50])

相关: