鉴于此表:
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
的所有此类事件。我怎么能这样做?
答案 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])
相关: