如何通过 Oracle 中的正则表达式从逗号分隔列表中删除重复项,但我不想要重复值? [复制]

Posted

技术标签:

【中文标题】如何通过 Oracle 中的正则表达式从逗号分隔列表中删除重复项,但我不想要重复值? [复制]【英文标题】:How to remove duplicates from comma separated list by regex in Oracle but I don't want duplicates values? [duplicate] 【发布时间】:2018-08-07 03:08:33 【问题描述】:

我有这个字符串

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;

【问题讨论】:

正则表达式在这里无济于事。这通常通过拆分为项目,获取唯一的出现,然后将字符串连接回来来解决。 【参考方案1】:

试试这个,根据文章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

【讨论】:

我仍然收到重复 ABCD1234 @Hardik - 抱歉,我错过了逗号后面的空格 - ", ",已修复。 也更新了小提琴 谢谢。它正在工作【参考方案2】:

这是一种选择:

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>

【讨论】:

以上是关于如何通过 Oracle 中的正则表达式从逗号分隔列表中删除重复项,但我不想要重复值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用 pandas 正则表达式基于逗号字符分隔列数据

通过正则表达式获取逗号分隔的数字

正则表达式匹配两个或多个逗号分隔的整数

使用正则表达式拆分字符串时跳过逗号分隔字符串中的空格

如何通过 Oracle 中的 regexp_replace 从逗号分隔列表中删除重复项?

正则表达式逗号分隔分隔符