यहाँ अपनी समस्या को हल करने का तरीका बताया गया है।
select
regexp_replace(
'2,2,2.1,3,3,3,3,4,4'
,'([^,]+)(,\1)*(,|$)', '\1\3')
from dual
रिटर्न
2,2.1,3,4
19 सी से यह यहाँ देखने के लिए बनाया गया है
18 सी से और पहले समूह के भीतर की कोशिश यहाँ देखें
अन्यथा नियमित अभिव्यक्ति का उपयोग करें
नीचे जवाब:
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 स्ट्रिंग आकार सीमा में चला सकते हैं 'स्ट्रिंग संघनन का परिणाम बहुत लंबा है'।
Oracle 12cR2 से आप इस त्रुटि को यहाँ देख सकते हैं । वैकल्पिक रूप से प्रत्येक समूह में सदस्यों पर अधिकतम संख्या डालें। यह केवल तभी काम करेगा जब इसका ओके केवल पहले सदस्यों को सूचीबद्ध करने के लिए। यदि आपके पास बहुत लंबे चर तार हैं तो यह काम नहीं कर सकता है। आपको प्रयोग करना होगा।
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;
एक अन्य समाधान (इतना आसान नहीं) उम्मीद है कि ओरेकल स्ट्रिंग आकार सीमा से बचने के लिए - स्ट्रिंग आकार इस पोस्ट के लिए करने के लिए 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(),
'<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 - कुछ परीक्षण मामले - 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
वी 2 जैसे आइटम के भीतर निहित। 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