Недостающая часть - это функция / оператор, который возвращает элементы массива с указанных позиций (я действительно удивлен, что он отсутствует в выпуске, надеюсь, он будет исправлен). Давайте создадим их:
create or replace function array_from_positions(anyarray, int[]) returns anyarray
immutable language sql
as $$
select array_agg(a.x order by b.i)
from
unnest($1) with ordinality as a(x,i)
right join unnest($2) with ordinality as b(x,i) on (a.i=b.x)
$$;
Тест:
select
array_from_positions('{a,b,c,d}'::text[], '{2,1,10}'),
array_from_positions('{1,2,3,4}'::int[], '{2,1,10}');
┌──────────────────────┬──────────────────────┐
│ array_from_positions │ array_from_positions │
├──────────────────────┼──────────────────────┤
│ {b,a,NULL} │ {2,1,NULL} │
└──────────────────────┴──────────────────────┘
create operator ## (
procedure = array_from_positions,
leftarg = anyarray,
rightarg = int[] );
Тест:
select
'{a,b,c,d}'::text[] ## '{2,1,10}',
'{1,2,3,4}'::int[] ## '{2,1,10}';
┌────────────┬────────────┐
│ ?column? │ ?column? │
├────────────┼────────────┤
│ {b,a,NULL} │ {2,1,NULL} │
└────────────┴────────────┘
И последний тест для вашего примера:
with your_table(array1,array2) as (values
('{1,2,1}'::int[], '{hello,bye,hello}'::text[]))
select array2 ## array_positions(array1, 1) from your_table;
┌───────────────┐
│ ?column? │
├───────────────┤
│ {hello,hello} │
└───────────────┘