Sorununuzu nasıl çözeceğiniz aşağıda açıklanmıştır.
select
regexp_replace(
'2,2,2.1,3,3,3,3,4,4'
,'([^,]+)(,\1)*(,|$)', '\1\3')
from dual
İadeler
2,2.1,3,4
Oracle 19C'den inşa edilmiştir buraya bakın
18C ve öncesi grup içinde deneyin buraya bakın
Aksi takdirde normal ifadeler kullanın
Aşağıda cevapla:
select col1,
regexp_replace(
listagg(
col2 , ',') within group (order by col2)
,'([^,]+)(,\1)*(,|$)', '\1\3') )
from tableX
where rn = 1
group by col1;
Not: Yukarıdakiler çoğu durumda çalışacaktır - liste sıralanmalıdır, verilerinize bağlı olarak sondaki ve baştaki tüm boşlukları kırpmanız gerekebilir.
Bir grupta> 20 veya büyük dize boyutlarında çok sayıda öğeniz varsa, oracle dize boyutu sınırıyla karşılaşabilirsiniz 'dize birleştirme sonucu çok uzun'.
Oracle 12cR2'den bu hatayı bastırabilirsiniz buraya bakın . Alternatif olarak, her gruptaki üyelere bir maksimum sayı koyun. Bu sadece ilk üyelerin listelenmesi uygunsa işe yarar. Çok uzun değişken dizeleriniz varsa bu işe yaramayabilir. denemeniz gerekecek.
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;
(O kadar basit değil) Başka bir çözüm umarım oracle dize boyutu sınırını önlemek için - dize boyutu bu mesaja 4000 teşekkür sınırlıdır burada tarafından user3465996
select col1 ,
dbms_xmlgen.convert(
dbms_lob.substr(
ltrim(
REGEXP_REPLACE(REPLACE(
REPLACE(
XMLAGG(
XMLELEMENT("A",col2 )
ORDER BY col2).getClobVal(),
'<A>',','),
'</A>',''),'([^,]+)(,\1)*(,|$)', '\1\3'),
','),
4000,1)
, 1)
as col2
from sometable
where rn = 1
group by col1;
V1 - bazı test senaryoları - Bilginize
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-öğeler içinde bulunan öğeler örn. 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
regexp_replace('a,b,b,b,b,c','(^|,)(.+)(,\2)+', '\1\2')
-> a,b,b,c fail!
v3 - normal ifade Igor'a teşekkür edin! tüm durumlarda çalışır.
select
regexp_replace('2,2,2.1,3,3,4,4','([^,]+)(,\1)*(,|$)', '\1\3') ,
regexp_replace('2.1,1','([^,]+)(,\1)*(,|$)', '\1\3'),
regexp_replace('a,b,b,b,b,c','([^,]+)(,\1)*(,|$)', '\1\3')
from dual