以下是解决问题的方法。

select

regexp_replace(

'2,2,2.1,3,3,3,3,4,4'

,'([^,]+)(,\1)*(,|$)', '\1\3')

from dual

回报

2,2.1,3,4

答案(见下面的注释):

select col1,

regexp_replace(

listagg(

col2 , ',') within group (order by col2)  -- sorted

,'([^,]+)(,\1)*(,|$)', '\1\3') )

from tableX

where rn = 1

group by col1;

注意:以上内容适用于大多数情况 - 列表应该排序,您可能需要根据您的数据修剪所有尾随和前导空格。

如果你在> 20或大字符串大小的组中有很多项,你可能会遇到oracle字符串大小限制'字符串连接的结果太长'所以在每个组的成员上放一个最大数字。这只有在可以仅列出第一个成员的情况下才有效。如果你有很长的变量字符串,这可能不起作用。你将不得不进行实验。

select col1,

case

when count(col2) < 100 then

regexp_replace(

listagg(col2, ',') within group (order by col2)

,'([^,]+)(,\1)*(,|$)', '\1\3')

else

'Too many entries to list...'

end

from sometable

where rn = 1

group by col1;

另一种解决方案(没那么简单),希望能够避免oracle的字符串大小限制-字符串大小限制为4000感谢这个职位在这里通过user3465996

select col1  ,

dbms_xmlgen.convert(  -- HTML decode

dbms_lob.substr( -- limit size to 4000 chars

ltrim( -- remove leading commas

REGEXP_REPLACE(REPLACE(

REPLACE(

XMLAGG(

XMLELEMENT("A",col2 )

ORDER BY col2).getClobVal(),

'',','),

'',''),'([^,]+)(,\1)*(,|$)', '\1\3'),

','), -- remove leading XML commas ltrim

4000,1) -- limit to 4000 string size

, 1)  -- HTML.decode

as col2

from sometable

where rn = 1

group by col1;

一些测试用例 - 仅供参考

regexp_replace('2,2,2.1,3,3,4,4','([^,]+)(,\1)+', '\1')

-> 2.1,3,4 Fail

regexp_replace('2 ,2 ,2.1,3 ,3 ,4 ,4 ','([^,]+)(,\1)+', '\1')

-> 2 ,2.1,3,4 Success  - fixed length items

项目中包含的项目,例如。2,21

regexp_replace('2.1,1','([^,]+)(,\1)+', '\1')

-> 2.1 Fail

regexp_replace('2 ,2 ,2.1,1 ,3 ,4 ,4 ','(^|,)(.+)(,\2)+', '\1\2')

-> 2 ,2.1,1 ,3 ,4  -- success - NEW regex

regexp_replace('a,b,b,b,b,c','(^|,)(.+)(,\2)+', '\1\2')

-> a,b,b,c fail!

v3 - 正则表达式感谢伊戈尔!适用于所有情况。

select

regexp_replace('2,2,2.1,3,3,4,4','([^,]+)(,\1)*(,|$)', '\1\3') ,

---> 2,2.1,3,4 works

regexp_replace('2.1,1','([^,]+)(,\1)*(,|$)', '\1\3'),

--> 2.1,1 works

regexp_replace('a,b,b,b,b,c','([^,]+)(,\1)*(,|$)', '\1\3')

---> a,b,c works

from dual

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐