Очень часто, нужно соединить значения из одной колонки, в одну строку с разделителями. Для этого используется функция LISTAGG.
Например:
select listagg(s, ',') within group(order by s) res
from (select 'a' s from dual union all
select 'd' s from
dual union all
select 'b' s from
dual union all
select 'c' s from
dual union all
select 'a' s from
dual union all
select 'd' s from
dual)
/
RES
---------
a,a,b,c,d,d
Но что делать, если нам нужно удалить дубликаты. К сожалению, LISTAGG не поддерживает команду DISTINCT. Для удаления дубликатов, нужно воспользоваться регулярным выражением ([^,]+)(,\1)+', '\1:
select regexp_replace(listagg(s, ',') within group(order by s),
'([^,]+)(,\1)+', '\1') res
from (select 'a' s from dual union all
select 'd' s from
dual union all
select 'b' s from
dual union all
select 'c' s from
dual union all
select 'a' s from
dual union all
select 'd' s from
dual)
/
RES
---------
a,b,c,d
Спасибо.
ОтветитьУдалить