Как отсечь последние символы и оптимизировать запрос с 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
→ Ссылка