Hier ist eine Lösung mit einer rekursiv faktorisierten Unterabfrage (Oracle 11.2 und höher):
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
Notizen :
Sie sagten CLOB, aber in Ihrem Beispiel haben Sie aus einer varchar2-Zeichenfolge extrahiert. Ich habe to_clob()
hinzugefügt um zu sehen, ob/wie das auf einem CLOB funktioniert.
Ich habe instr
verwendet und substr
, da sie oft (normalerweise?) zwischen besser und viel besser abschneiden als ihr regexp
Äquivalente.
Ich habe den "Index" jeder Teilzeichenfolge innerhalb der Eingabezeichenfolge gespeichert; In einigen Fällen ist die Reihenfolge der Tokens in der Eingabezeichenfolge wichtig. (Allerdings nicht in Ihrem Beispiel, Sie hatten nur das gleiche Token fünfmal wiederholt.)
Wenn Sie eine bessere Leistung benötigen, insbesondere wenn Ihre CLOBs sehr groß sind, ist es möglicherweise besser, dbms_lob.substr
zu verwenden und dbms_lob.instr
- siehe Leistung von SUBSTR auf CLOB
, insbesondere die Antwort von Alex Poole, und die Dokumentation hier:http ://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_lob.htm#BABEAJAD
. Beachten Sie die Syntaxunterschiede zum regulären substr
/ instr
.