有只小跳蛙
以下是解决问题的方法。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 tableXwhere rn = 1group 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...'endfrom sometablewhere rn = 1group by col1;另一种解决方案(没那么简单),希望能够避免oracle的字符串大小限制-字符串大小限制为4000感谢这个职位在这里通过user3465996select 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(), '<A>',','), '</A>',''),'([^,]+)(,\1)*(,|$)', '\1\3'), ','), -- remove leading XML commas ltrim 4000,1) -- limit to 4000 string size , 1) -- HTML.decode as col2 from sometablewhere rn = 1group by col1;一些测试用例 - 仅供参考regexp_replace('2,2,2.1,3,3,4,4','([^,]+)(,\1)+', '\1')-> 2.1,3,4 Failregexp_replace('2 ,2 ,2.1,3 ,3 ,4 ,4 ','([^,]+)(,\1)+', '\1')-> 2 ,2.1,3,4 Success - fixed length items项目中包含的项目,例如。2,21regexp_replace('2.1,1','([^,]+)(,\1)+', '\1')-> 2.1 Failregexp_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 worksregexp_replace('2.1,1','([^,]+)(,\1)*(,|$)', '\1\3'),--> 2.1,1 worksregexp_replace('a,b,b,b,b,c','([^,]+)(,\1)*(,|$)', '\1\3')---> a,b,c worksfrom dual