Как отсечь последние символы и оптимизировать запрос с regexp_replace?
Выбираю рейсы из большого текста. В запросе ниже представлен примерный фрагмент.
Как отсечь последнюю запятую и остальные символы после неё? И можно ли как-то проще сделать запрос чем у меня? Это просто интересно, не придумываю ли я велосипед?
with t as
(select '456 54 6g gh dfg h 356 36SVO SU1111 SU3911 прилёт SOF в SVO SU0222 SVO SU3333 прилёт SU0004ac' x
from dual)
select y from (select regexp_replace(x, '(.*?(SU\w{4}))', '\2,') y from t);
Результат:
SU1111,SU3911,SU0222,SU3333,SU0004,ac
А ожидается:
SU1111,SU3911,SU0222,SU3333,SU0004
PS СУБД - Oracle 11g, IDE - PL/SQL Developer
Ответы (2 шт):
Автор решения: Akina
→ Ссылка
with t as
(select '456 54 6g gh dfg h 356 36SVO SU1111 SU3911 прилёт SOF в SVO SU0222 SVO SU3333 прилёт SU0004ac' x
from dual
)
select y
from (select rtrim(regexp_replace(x, '(.*?(SU\w{4})[^S]*)', '\2,'), ',') y
from t
);
https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=cbf3c0beadbc71247bdb45d6849dd42c
Автор решения: 0xdb
→ Ссылка
Или так:
with t as (
select '
456 54 6g gh dfg h 356 36SVO SU1111 SU3911
прилёт SOF в SVO SU0222 SVO SU3333 прилёт SU0004ac' x
from dual)
select listagg (regexp_substr (x, '(.*?)(SU\d{4})', 1, level, null, 2), ',')
within group (order by 1) res
from t connect by level <= regexp_count (x, 'SU\d{4}')
/
RES
------------------------------------------------
SU1111,SU3911,SU0222,SU3333,SU0004