Hier is een oplossing met een recursieve factored subquery (Oracle 11.2 en hoger):
with inputs ( str ) as (
select to_clob('ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0')
from dual
),
prep ( s, n, token, st_pos, end_pos ) as (
select ',' || str || ',', -1, null, null, 1
from inputs
union all
select s, n+1, substr(s, st_pos, end_pos - st_pos),
end_pos + 1, instr(s, ',', 1, n+3)
from prep
where end_pos != 0
)
select n as idx, token as column_name
from prep
where n > 0;
IDX COLUMN_NAME
------ ----------------------------
1 ABCDEF:PmId12345RmLn1VlId0
2 ABCDEF:PmId12345RmLn1VlId0
3 ABCDEF:PmId12345RmLn1VlId0
4 ABCDEF:PmId12345RmLn1VlId0
5 ABCDEF:PmId12345RmLn1VlId0
Opmerkingen :
Je zei CLOB, maar in je voorbeeld heb je geëxtraheerd uit een varchar2-string. Ik heb to_clob()
added toegevoegd om te zien of/hoe dit werkt op een CLOB.
Ik gebruikte instr
en substr
, omdat ze vaak (meestal?) tussen beter en veel beter presteren dan hun regexp
equivalenten.
Ik heb de "index" van elke substring opgeslagen in de invoerstring; in sommige gevallen is de volgorde van de tokens in de invoerreeks belangrijk. (In jouw voorbeeld echter niet, je had dezelfde token net vijf keer herhaald.)
Als u betere prestaties nodig heeft, vooral als uw CLOB's erg groot zijn, kunt u beter dbms_lob.substr
gebruiken en dbms_lob.instr
- zie Prestaties van SUBSTR op CLOB
, vooral het antwoord van Alex Poole en documentatie hier:http ://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_lob.htm#BABEAJAD
. Let op de syntaxisverschillen versus gewone substr
/ instr
.