Шаги для решения проблемы, как показано ниже.Вы можете сначала создать массив из вашей строки:
postgres=# select string_to_array(regexp_replace(replace(replace('YYNNNNNNNNNNNNNYYNNNNN','Y','Y,'),'N','N,'),',$',''),',') as arr;
arr
-----------------------------------------------
{Y,Y,N,N,N,N,N,N,N,N,N,N,N,N,N,Y,Y,N,N,N,N,N}
(1 row)
А затем преобразовать массив в несколько строк и присвоить каждой строке номер сортировки:
postgres=# with tmp as (
select string_to_array(regexp_replace(replace(replace('YYNNNNNNNNNNNNNYYNNNNN','Y','Y,'),'N','N,'),',$',''),',') as arr
)
select
unnest(arr) as letter,
generate_series(1,array_length(arr,1),1) as sort
from
tmp;
letter | sort
--------+------
Y | 1
Y | 2
N | 3
N | 4
N | 5
N | 6
N | 7
N | 8
N | 9
N | 10
N | 11
N | 12
N | 13
N | 14
N | 15
Y | 16
Y | 17
N | 18
N | 19
N | 20
N | 21
N | 22
(22 rows)
Окончательный полный SQL-запрос, который вы хотите:
postgres=# with tmp as (
select string_to_array(regexp_replace(replace(replace('YYNNNNNNNNNNNNNYYNNNNN','Y','Y,'),'N','N,'),',$',''),',') as arr
)
,tmp_2 as (
select
unnest(arr) as letter,
generate_series(1,array_length(arr,1),1) as sort
from
tmp
)
select * from tmp_2 where letter = 'Y';
letter | sort
--------+------
Y | 1
Y | 2
Y | 16
Y | 17
(4 rows)
postgres=# with tmp as (
select string_to_array(regexp_replace(replace(replace('YYNNNNNNNNNNNNNYYNNNNN','Y','Y,'),'N','N,'),',$',''),',') as arr
)
,tmp_2 as (
select
unnest(arr) as letter,
generate_series(1,array_length(arr,1),1) as sort
from
tmp
)
select letter,array_to_string(array_agg(sort),',') as result from tmp_2 where letter = 'Y' group by letter;
letter | result
--------+-----------
Y | 1,2,16,17
(1 row)