sql - 如何通过 Oracle regexp_replace 从空格分隔列表中删除重复项?

标签 sql regex oracle

这个问题在这里已经有了答案:





How to remove duplicates from comma separated list by regexp_replace in Oracle?

(2 个回答)


3年前关闭。




我有一个名为“A B A A C D”的列表。我的预期结果是“A B C D”。到目前为止,我发现了网络

regexp_replace(l_user ,'([^,]+)(,[ ]*\1)+', '\1');

表达。但这是为,分隔列表。需要做哪些修改才能使其成为空格分隔的列表。无需考虑顺序。

最佳答案

如果我理解得很好,您不仅需要用空格替换 ',' ,还需要以更智能的方式删除重复项。

如果我修改该表达式以使用空格而不是“,”,我会得到

select regexp_replace('A B A A C D' ,'([^ ]+)( [ ]*\1)+', '\1') from dual

这给 'A B A C D' ,不是你需要的。

获得所需结果的一种方法可能如下所示,稍微复杂一点:
with string(s) as ( select 'A B A A C D' from dual)    
    select listagg(case when rn = 1 then str end, ' ') within group (order by lev)
    from (
            select str,  row_number() over (partition by str order by 1) rn, lev
            from (
                SELECT trim(regexp_substr(s, '[^ ]+', 1, level)) str,
                       level as lev
                  FROM string
                CONNECT BY instr(s, ' ', 1, level - 1) > 0
                )
         )

我的主要问题是我无法构建一个检查非相邻重复项的正则表达式,所以我需要拆分字符串,检查重复项,然后再次聚合非重复值,保持顺序。

如果您不介意结果字符串中标记的顺序,则可以简化:
with string(s) as ( select 'A B A A C D' from dual)
select listagg(str, ' ') within group (order by 1)
from (
        SELECT distinct trim(regexp_substr(s, '[^ ]+', 1, level)) as str
          FROM string
        CONNECT BY instr(s, ' ', 1, level - 1) > 0
     )

关于sql - 如何通过 Oracle regexp_replace 从空格分隔列表中删除重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40259200/

相关文章:

sql - Grails更新生产数据库

Python-查找并替换字符串变量中的正则表达式子字符串

Oracle 序列值未排序

java - 既然 Oracle 停用了 Suns 下载站点,我应该在哪里下载适用于 Linux 的 javacomm?

Python - 如何使用 ' in 值发出 SQL insert into 语句

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - 计算 Sum() 但不包括 JOIN

IPv6 的 PHP preg_match 问题

java - 需要一个正则表达式来验证带有 utc 的时间戳

java - 为用户定义的 Oracle 表类型编写 MyBatis3 TypeHandler