Как удалить дубликаты из списка, разделенного запятыми, с помощью регулярного выражения в Oracle, но мне не нужны повторяющиеся значения?

у меня есть эта строка

ABCD1234, XYZ, ABCD1234, ABCD1234C, ABCD1234, abc, abcX, 1234U, 1234

и я хочу, но не хочу дублировать значения

ABCD1234, XYZ, ABCD1234C, abc, abcX, 1234U, 1234,

Я использую регулярное выражение ниже

select regexp_replace (
    'ABCD1234, XYZ, ABCD1234, ABCD1234C, ABCD1234, abc, abcX, 1234U, 1234',
     '([^,]+)(,\1)+', '\1'
 ) test
from dual;

person Hardik    schedule 27.02.2018    source источник
comment
Regex здесь не поможет. Обычно это решается путем разбиения на элементы, получения уникальных вхождений, а затем обратного соединения строки.   -  person Wiktor Stribiżew    schedule 27.02.2018


Ответы (2)


Попробуйте это, как описано в статье http://www.dba-oracle.com/t_extract_comma_delimited_strings_oracle_sql.html< /а>:

select distinct str from
(select regexp_substr ('ABCD1234, XYZ, ABCD1234, ABCD1234C, ABCD1234, abc, abcX, 1234U, 1234', '[^, ]+',1, rownum) str 
from dual 
connect by level <= regexp_count ('ABCD1234, XYZ, ABCD1234, ABCD1234C, ABCD1234, abc, abcX, 1234U, 1234', '[^, ]+')) v;

Скрипт: http://sqlfiddle.com/#!4/c858d/5

person user4219031    schedule 27.02.2018
comment
Я все еще получаю дубликаты ABCD1234 - person Hardik; 27.02.2018
comment
@Hardik - извините, пропустил пробел после запятой - , , Исправил. - person user4219031; 27.02.2018
comment
Обновил скрипку тоже - person user4219031; 27.02.2018
comment
Спасибо. Это работает - person Hardik; 27.02.2018

Вот один из вариантов:

SQL> with test (id, col) as
  2    (select 1, 'ABCD1234, XYZ, ABCD1234, ABCD1234C, ABCD1234, abc, abcX, 1234U, 1234' from dual union
  3     select 2, '111, 222, 111, ABCX2, FFE, 222' from dual
  4    ),
  5  t_rows as
  6    (select id, regexp_substr(col, '[^, ]+', 1, column_value) col
  7     from test,
  8          table(cast(multiset(select level from dual
  9                              connect by level <= regexp_count(col, ',') + 1)
 10                              as sys.odcinumberlist))
 11    ),
 12  t_distinct as
 13    (select distinct id, col
 14     from t_rows
 15    )
 16  select id, listagg(col, ', ') within group (order by null) col
 17  from t_distinct
 18  group by id;

        ID COL
---------- --------------------------------------------------
         1 1234, 1234U, ABCD1234, ABCD1234C, XYZ, abc, abcX
         2 111, 222, ABCX2, FFE

SQL>
person Littlefoot    schedule 27.02.2018