如何根据postgresql9.4中的第一个索引获取数组元素的第二个索引值?

时间:2016-02-01 13:05:10

标签: arrays database postgresql-9.4

我有一个名为arraytable的表 - > create table arraytable(id int, somearray int[][])

INSERT INTO arraytable(id, somearray) values(1,array[[3,5],[4,12]]);
INSERT INTO arraytable(id, somearray) values(2,array[[7,15],[13,47],[15,27],[18,97]]);
INSERT INTO arraytable(id, somearray) values(3,array[[56,1],[67,78],[105,78]]);

我不知道如何根据数组元素的特定第一个索引值在所有行中选择数组元素的第二个索引值;

首先,我想选择6个第一个索引值小于67的数组元素,如下所示:

[4,12],[7,15],[13,47],[15,27],[18,97],[56,1] 

现在我需要选择这些的第二个索引值,如下所示:

12, 15, 47, 27, 97, 1.

1 个答案:

答案 0 :(得分:0)

这太难看了我确定有更好的方法可以做到这一点,但由于没有人回答过这个问题,我会发布这个答案,记住我不会这么想#&# 39;一个很好的解决方案和稳定的解决方案。不要在生产中使用它!对于我对Postgres中多维数组如何工作的知识非常有限,这对我来说只是一个练习。

这只是为了回答:

with x as (
  select foo.id, goo.nr, goo.first_ind, foo.somearray 
  from (
    select *, somearray[1:array_upper(somearray,1)][1] AS first_indexes 
    from arraytable
  ) foo, 
  unnest(foo.first_indexes) WITH ORDINALITY goo(first_ind,nr) 
  where goo.first_ind < 67
) 
select string_agg(z.second_ind::text, ', ' order by x.id, x.nr) 
from x 
join (
  select * 
  from (
    select id, first_ind, somearray[1:array_upper(somearray,1)][2:3] AS second_indexes 
    -- [2:3] should actually be [2] but for some reason it wouldn't work? so this is specific to data with 2 indexes
    from x
  ) y, 
  unnest(y.second_indexes) WITH ORDINALITY goo(second_ind,nr)
) z on 
  x.id=z.id 
  and x.nr=z.nr 
  and x.first_ind=z.first_ind;

输出:

     string_agg
--------------------
5, 12, 15, 47, 27, 97, 1
(1 row)

此外,应考虑{3,5},因此输出中应出现5