Как получить все позиционные индексы конкретного символа в строке? - PullRequest
0 голосов
/ 12 июня 2019

Я использую Postgres и PgAdmin3.Я застрял и даже не знаю, с чего начать!

У меня есть столбец, который имеет следующий формат:

tvd_unit
YYNNNNNNNNNNNNNYYNNNNN

Столбец содержит 22 позиции, позиции представляют, является липоведение активно или нет в конкретной бизнес-единице, через да или нет (Д или Н)

В приведенном выше примере параметр активен только в 1, 2, 16 и 17 единицах.А остальное отключено, мне нужно разработать запрос, чтобы вернуть каждое число единиц, где активен параметр, в приведенном выше примере мне нужно вернуть:

1, 2, 16, 17

Я, честно говоря, понятия не имею, какначать получать количество единиц, и мне нужна помощь.

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Шаги для решения проблемы, как показано ниже.Вы можете сначала создать массив из вашей строки:

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)
0 голосов
/ 12 июня 2019

Вы можете использовать generate_series и substr, чтобы получить каждый элемент из вашей строки:

with data as (select 'YYNNNNNNNNNNNNNYYNNNNN' as tvd_unit)
select position,
       substr(tvd_unit, position, 1) as active
FROM data, 
     generate_series(1, length(tvd_unit), 1) g(position)
WHERE substr(tvd_unit, position, 1) = 'Y';
 position | active
----------+--------
        1 | Y
        2 | Y
       16 | Y
       17 | Y
(4 rows)
...