我需要你的帮助来使用regexp_replace函数。我有一个表,其中有一列包含重复的串接字符串值。我如何消除它们?
示例:
Ian,Beatty,Larry,Neesha,Beatty,Neesha,Ian,Neesha
我需要输出为
Ian,Beatty,Larry,Neesha
复制品是随机的,没有任何特定的顺序。
最新消息
这是我的table的外观
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
我试过使用listagg和distinct,但是我不能删除重复的。
4条答案
按热度按时间ulydmbyx1#
我觉得最简单的选择-
Demo.
jdgnovmf2#
所以,试试这个...
lmyy7pcs3#
如果重复的值不是相邻的,我不认为仅仅使用
regexp_replace
就可以做到这一点,一种方法是将值拆分,消除重复,然后将它们放回一起。标记分隔字符串的常用方法是使用
regexp_substr
和connect by
子句,在字符串中使用绑定变量可以使代码更清晰:您可以将其用作子查询(或CTE),从中获取不同的值,然后使用
listagg
重新组装它:如果你在一个表中查看多行,这就有点复杂了,因为这会混淆connect-by语法,但是你可以使用一个非确定性的引用来避免循环:
当然,如果您正确地存储了关系数据,这就没有必要了;在列中使用分隔字符串不是一个好主意。
dldeef674#
在这种情况下,有一种方法可以找到重复项,但如果每个id在一个字符串中有多个重复的名称,则删除它们会有问题。下面是可以处理每个id一个重复项的代码。
样本数据:
创建CTE,将您的LISTAGG ststring与原始数据进行比较,查找重复值:
主SQL使用Union在发现重复的地方构建新字符串(删除第二次出现的字符串),然后在与旧字符串比较后放置新字符串。
对于一个字符串中的多个示例或多个不同的名称,应该进行一些递归或多个嵌套来完成它...