Я не думаю, что вы можете сделать это только с помощью regexp_replace
, если повторяющиеся значения не находятся рядом друг с другом. Один из подходов состоит в том, чтобы разделить значения, удалить дубликаты, а затем снова собрать их вместе.
Обычный метод токенизации строки с разделителями — с regexp_substr
и предложением connect by
. Использование переменной связывания с вашей строкой, чтобы сделать код немного понятнее:
var value varchar2(100);
exec :value := 'Ian,Beatty,Larry,Neesha,Beatty,Neesha,Ian,Neesha';
select regexp_substr(:value, '[^,]+', 1, level) as value
from dual
connect by regexp_substr(:value, '[^,]+', 1, level) is not null;
VALUE
------------------------------
Ian
Beatty
Larry
Neesha
Beatty
Neesha
Ian
Neesha
Вы можете использовать это как подзапрос (или CTE), получить из него отдельные значения, а затем собрать его с помощью listagg
:
select listagg(value, ',') within group (order by value) as value
from (
select distinct value from (
select regexp_substr(:value, '[^,]+', 1, level) as value
from dual
connect by regexp_substr(:value, '[^,]+', 1, level) is not null
)
);
VALUE
------------------------------
Beatty,Ian,Larry,Neesha
Это немного сложнее, если вы просматриваете несколько строк в таблице, поскольку это сбивает с толку синтаксис подключения, но вы можете использовать недетерминированную ссылку, чтобы избежать циклов:
with t42 (id, value) as (
select 1, 'Ian,Beatty,Larry,Neesha,Beatty,Neesha,Ian,Neesha' from dual
union all select 2, 'Mary,Joe,Mary,Frank,Joe' from dual
)
select id, listagg(value, ',') within group (order by value) as value
from (
select distinct id, value from (
select id, regexp_substr(value, '[^,]+', 1, level) as value
from t42
connect by regexp_substr(value, '[^,]+', 1, level) is not null
and id = prior id
and prior dbms_random.value is not null
)
)
group by id;
ID VALUE
---------- ------------------------------
1 Beatty,Ian,Larry,Neesha
2 Frank,Joe,Mary
Конечно, в этом не было бы необходимости, если бы вы правильно хранили реляционные данные; наличие строки с разделителями в столбце - не очень хорошая идея.
person
Alex Poole
schedule
11.02.2016