如何通过 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 中的正则表达式从逗号分隔列表中删除重复项,但我不想要重复值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章