Đây là cách giải quyết vấn đề của bạn.
select
regexp_replace(
'2,2,2.1,3,3,3,3,4,4'
,'([^,]+)(,\1)*(,|$)', '\1\3')
from dual
trả lại
2,2.1,3,4
Từ oracle 19C, nó được xây dựng tại đây
Từ 18C trở lên thử trong nhóm xem tại đây
Nếu không, hãy sử dụng biểu thức chính quy
Trả lời dưới đây:
select col1,
regexp_replace(
listagg(
col2 , ',') within group (order by col2) -- sorted
,'([^,]+)(,\1)*(,|$)', '\1\3') )
from tableX
where rn = 1
group by col1;
Lưu ý: Cách trên sẽ hoạt động trong hầu hết các trường hợp - danh sách phải được sắp xếp, bạn có thể phải cắt bỏ tất cả khoảng trống ở cuối và đầu tùy thuộc vào dữ liệu của bạn.
Nếu bạn có rất nhiều mục trong một nhóm> 20 hoặc kích thước chuỗi lớn, bạn có thể gặp phải giới hạn kích thước chuỗi oracle 'kết quả của việc nối chuỗi quá dài'.
Từ oracle 12cR2 bạn có thể loại bỏ lỗi này xem tại đây . Hoặc đặt số lượng tối đa cho các thành viên trong mỗi nhóm. Điều này sẽ chỉ hoạt động nếu chỉ liệt kê những thành viên đầu tiên là được. Nếu bạn có chuỗi biến rất dài, điều này có thể không hoạt động. bạn sẽ phải thử nghiệm.
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;
Một giải pháp khác (không đơn giản như vậy) để hy vọng tránh giới hạn kích thước chuỗi oracle - kích thước chuỗi được giới hạn ở 4000. Cảm ơn bài đăng này ở đây của người dùng3465996
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(),
'<A>',','),
'</A>',''),'([^,]+)(,\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;
V1 - một số trường hợp thử nghiệm - FYI
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
V2-các thẻ chứa trong các mục, ví dụ. 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 - regex cảm ơn Igor! hoạt động mọi trường hợp.
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