Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So teilen Sie ein CLOB-Objekt mit , und :als Trennzeichen in Oracle in mehrere Datensätze auf

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 .