sql >> Database >  >> RDS >> Oracle

Hoe een CLOB-object te splitsen met behulp van , en :scheidingsteken in Oracle in meerdere records

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 .



  1. MySQL-query om gegevens met kolomnamen op te halen

  2. gegevens geladen uit SQLitE-database worden niet opgeslagen in de modelklasse ArrayList android

  3. Hoe update ik als het bestaat, voeg ik het in als dat niet het geval is (AKA upsert of merge) in MySQL?

  4. Een PHP/MySQL-tijdstempel er aantrekkelijker uit laten zien