with d (id, status, empl) as
(
select 1 ,'Created;Solved;Closed', 'John;Terry;Martin' from dual union all
select 2 ,'Created2;Reviewed2;Solved2;Closed2', 'John2;Bell2;Terry2;Martin2' from dual
)
,cte(id, status, s, e, empl, s1, e1, rn) as
(
select
id, status, 1, case when instr(status, ';') > 0 then instr(status, ';') else length(status)+1 end,
empl, 1, case when instr(empl, ';') > 0 then instr(empl, ';') else length(empl)+1 end, 0
from d
union all
select
id, status, e+1, case when instr(status, ';' , e+1) > 0 then instr(status, ';', e+1) else length(status)+1 end,
empl, e1+1, case when instr(empl, ';' , e1+1) > 0 then instr(empl, ';', e1+1) else length(empl)+1 end, rn+1
from cte where e <= length(status)
-- assumption: equal number of delimiters (;) in status and empl column values
)
select id, substr(status, s, e - s) status, substr(empl, s1, e1 - s1) empl from cte
order by id,rn
;
ID STATUS EMPL
---------- ---------------------------------- --------------------------
1 Created John
1 Solved Terry
1 Closed Martin
2 Created2 John2
2 Reviewed2 Bell2
2 Solved2 Terry2
2 Closed2 Martin2
寫一個函數或SP。有一個遊標在其中,並與每一行循環。在每一行中,如問題所示,用(;)分割數據。現在有一個臨時表並繼續添加。 – Prathyush
這會在你的應用層更容易處理,例如Java的。數據庫不是清理數據的最佳位置。 –
首先規範化或至少使用集合類型。使用CSV是一個非常糟糕的主意。 – lad2025