İhtiyaç:
t tablosu
———
s1, s2
1, ‘a’
2, ‘a,b,c’
3, ‘a,b’
4, ‘c,b’
Tablosunu yukarıdaki durumdan aşağıdaki duruma çevirmek. (s2 sütununda virgül ile ayrılmış değerleri satırlara çevirmek. Bir diğer kriter de bu tablonun milyon satır olduğunda da performanslı çalışabilmesi. Bir satırın kaça parçalanacağı (kaç satıra çevirileceği) virgüller sayılarak hesaplanabilir.)
sorgu sonucu amaçlanan
———————-
s1, s2
1, ‘a’
2, ‘a’
2, ‘b’
2, ‘c’
3, ‘a’
3, ‘b’
4, ‘c’
4, ‘b’
Oracle özyinelemeli (recursive) sql sorgu ifadesi ile çözüm:
WITH split (s1, s2, s2_count, split_level) AS ( select t1.s1, t1.s2, regexp_count(t1.s2,',') as s2_count, 1 as split_level from t t1 union all select split.s1, split.s2, split.s2_count, split.split_level+1 as split_level from split where split_level < s2_count ) SELECT s1, s2, s2_count, split_level, case when s2_count > 1 and s2_count <> split_level then substr( s2, instr(s2,',',1,split_level), (instr(s2,',',1,split_level+1)-instr(s2,',',1,split_level)-2) ) when s2_count > 1 and re_cnt = lvl then substr( s2, instr(s2,',',1,split_level), (length(s2)-instr(s2,',',1,split_level)+1) ) else s2 end as new_s2 FROM split ORDER BY 1,2,3,4,5