среда, 22 февраля 2017 г.

Удаление дубликатов из строки

Очень часто, нужно соединить значения из одной колонки, в одну строку с разделителями. Для этого используется функция 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

1 комментарий: