sql >> Databáze >  >> RDS >> Oracle

Jak rozdělit objekt CLOB pomocí oddělovače , a :v Oracle do více záznamů

Zde je řešení pomocí rekurzivního faktorovaného poddotazu (Oracle 11.2 a vyšší):

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

Poznámky :

Řekli jste CLOB, ale ve svém příkladu jste extrahovali z řetězce varchar2. Přidal jsem to_clob() abyste zjistili, zda/jak to funguje na CLOB.

Použil jsem instr a substr , protože často (obvykle?) fungují mezi lepšími a mnohem lepšími než jejich regexp ekvivalenty.

Uložil jsem "index" každého podřetězce do vstupního řetězce; v některých případech je důležité pořadí tokenů ve vstupním řetězci. (Ve vašem příkladu však ne, právě jste opakovali stejný token pětkrát.)

Pokud potřebujete lepší výkon, zejména pokud jsou vaše CLOB velmi velké, může být lepší použít dbms_lob.substr a dbms_lob.instr – viz Výkon SUBSTR na CLOB , zejména odpověď Alexe Poolea a dokumentace zde:http ://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_lob.htm#BABEAJAD . Všimněte si rozdílů v syntaxi oproti běžnému substr / instr .



  1. Hibernace odesílání cizích dotazů do databáze

  2. Jak vyřešit Obecnou chybu:2006 MySQL server odešel

  3. Pochopení aliasů sloupců ve výběrovém dotazu na serveru SQL - SQL Server / výukový program TSQL, část 115

  4. Jak vnější-připojit dva stoly (hlavní a podtabulku many-to-one), abyste získali pouze JEDNU položku z druhého stolu?