Sql 在Oracle中删除逗号分隔字符串中的重复值
我需要您对regexp\u replace函数的帮助。我有一个表,其中有一列用于包含重复项的串联字符串值。如何消除它们 例如: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
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之前获取不同的值呢?