আপনার সমস্যাটি কীভাবে সমাধান করবেন তা এখানে।
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)
,'([^,]+)(,\1)*(,|$)', '\1\3') )
from tableX
where rn = 1
group by col1;
দ্রষ্টব্য: উপরেরটি বেশিরভাগ ক্ষেত্রে কাজ করবে - তালিকাটি বাছাই করা উচিত, আপনার ডেটার উপর নির্ভর করে আপনাকে সমস্ত ট্রেলিং এবং শীর্ষস্থানীয় জায়গা ট্রিম করতে হতে পারে।
আপনার কাছে একটি গ্রুপ> 20 বা বড় স্ট্রিং মাপের প্রচুর আইটেম থাকলে আপনি ওরাকল স্ট্রিং আকারের সীমাতে চালিত হতে পারেন 'স্ট্রিং কনকেন্টেশনের ফলাফল খুব দীর্ঘ'।
ওরাকল 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 এর মধ্যে সীমাবদ্ধ user ব্যবহারকারী 3465996 দ্বারা পোস্টটি ধন্যবাদ এখানে
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;
ভি 1 - কিছু পরীক্ষার কেস - এফওয়াইআই
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 -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
regexp_replace('a,b,b,b,b,c','(^|,)(.+)(,\2)+', '\1\2')
-> a,b,b,c fail!
ভি 3 - রেজেক্স ইগরকে ধন্যবাদ! সব ক্ষেত্রে কাজ করে।
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