Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle中删除逗号分隔字符串中的重复值_Sql_Oracle_Listagg - Fatal编程技术网

Sql 在Oracle中删除逗号分隔字符串中的重复值

Sql 在Oracle中删除逗号分隔字符串中的重复值,sql,oracle,listagg,Sql,Oracle,Listagg,我需要您对regexp\u replace函数的帮助。我有一个表,其中有一列用于包含重复项的串联字符串值。如何消除它们 例如: Ian,Beatty,Larry,Neesha,Beatty,Neesha,Ian,Neesha 我需要输出为 Ian,Beatty,Larry,Neesha 副本是随机的,没有任何特定的顺序 更新-- 这是我的桌子的样子 ID Name1 Name2 Name3 1 a b c 1 c

我需要您对regexp\u replace函数的帮助。我有一个表,其中有一列用于包含重复项的串联字符串值。如何消除它们

例如:

Ian,Beatty,Larry,Neesha,Beatty,Neesha,Ian,Neesha
我需要输出为

Ian,Beatty,Larry,Neesha
副本是随机的,没有任何特定的顺序

更新--

这是我的桌子的样子

ID   Name1   Name2    Name3     
1     a       b         c
1     c       d         a
2     d       e         a
2     c       d          b
我需要每个ID有一行,在一行中有不同的name1、name2、name3作为逗号分隔的字符串

ID    Name
1     a,c,b,d,c
2     d,c,e,a,b
我曾尝试将Listag与distinct一起使用,但无法删除重复项

那么,试试这个

([^,]+),(?=.*[A-Za-z],[] ]*\1)

如果重复的值彼此不相邻,我不认为仅使用
regexp\u replace
就可以做到这一点。一种方法是将值拆分,消除重复项,然后将它们重新组合在一起

标记分隔字符串的常用方法是使用
regexp\u substr
connectby
子句。在字符串中使用bind变量使代码更清晰:

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),从中获取不同的值,然后使用
listag
重新组装它:

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       
如果您查看一个表中的多行,会有点复杂,因为这会混淆connect by语法,但您可以使用非确定性引用来避免循环:

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                

当然,如果您正确地存储了关系数据,那么这是不必要的;在列中使用分隔字符串不是一个好主意。

实现这一点的最佳方法是跳过正则表达式并在逗号上拆分名称,将结果列表强制转换为一个集合,然后在传递集合时使用join string方法

姓名='Ian,Beatty,Larry,Neesha,Beatty,Neesha,Ian,Neesha' >>>已删除重复的_名称=','.join(set(names.split(',')) >>>打印(重复数据消除的\u名称) 尼莎,伊恩,拉里,比蒂
使用正确的连接表(甚至是嵌套表)而不是逗号分隔的列表是一个很好的理由。祝你好运。这看起来是一个重复的模式是不同的,不与我的数据工作。DUP仍然存在。我将尝试一下,并让您知道…数据实际上并不作为分隔字符串存在。它来自每个id的多行,我使用Listag将它们连接到每个id的1行中id@Cindy-那么为什么不在调用Listag之前获取不同的值呢?