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

Rozdělení řetězce do více řádků v Oracle

Toto může být vylepšený způsob (také s regulárním výrazem a připojením pomocí):

with temp as
(
    select 108 Name, 'test' Project, 'Err1, Err2, Err3' Error  from dual
    union all
    select 109, 'test2', 'Err1' from dual
)
select distinct
  t.name, t.project,
  trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value))  as error
from 
  temp t,
  table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(t.error, '[^,]+'))  + 1) as sys.OdciNumberList)) levels
order by name

UPRAVIT :Zde je jednoduché (jako v „ne do hloubky“) vysvětlení dotazu.

  1. length (regexp_replace(t.error, '[^,]+')) + 1 používá regexp_replace smazat vše, co není oddělovač (v tomto případě čárka) a length +1 zjistit, kolik prvků (chyb) je tam.
  2. select level from dual connect by level <= (...) používá hierarchický dotaz pro vytvoření sloupce s rostoucím počtem nalezených shod, od 1 do celkového počtu chyb.

    Náhled:

    select level, length (regexp_replace('Err1, Err2, Err3', '[^,]+'))  + 1 as max 
    from dual connect by level <= length (regexp_replace('Err1, Err2, Err3', '[^,]+'))  + 1
    
  3. table(cast(multiset(.....) as sys.OdciNumberList)) dělá nějaké casting věšteckých typů.
    • cast(multiset(.....)) as sys.OdciNumberList transformuje více kolekcí (jedna kolekce pro každý řádek v původní sadě dat) do jediné kolekce čísel, OdciNumberList.
    • table() funkce transformuje kolekci na sadu výsledků.
  4. FROM bez spojení vytvoří křížové spojení mezi vaší datovou množinou a vícenásobnou množinou. V důsledku toho se řádek v sadě dat se 4 shodami bude opakovat 4krát (s rostoucím číslem ve sloupci s názvem „hodnota_sloupce“).

    Náhled:

    select * from 
    temp t,
    table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(t.error, '[^,]+'))  + 1) as sys.OdciNumberList)) levels
    
  5. trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value)) používá column_value jako n-tý_vzhled/výskyt parametr pro regexp_substr .
  6. Můžete přidat některé další sloupce ze souboru dat (t.name, t.project jako příklad) pro snadnou vizualizaci.

Některé odkazy na dokumenty Oracle:

  • REGEXP_REPLACE
  • REGEXP_SUBSTR
  • Konstanty, typy a mapování rozšiřitelnosti (OdciNumberList)
  • CAST (multiset)
  • Hierarchické dotazy


  1. Zjištění počtu znaků a čísel v řetězci

  2. Ovladač JDBC PostgreSQL pro Android

  3. Načítání obrazových dat do sloupců BLOB v Oracle

  4. Jak převést křížový dotaz zpět na normální dotaz v Accessu