sql >> Databasteknik >  >> RDS >> Oracle

Dela upp strängen i flera rader i Oracle

Detta kan vara ett förbättrat sätt (även med regexp och connect by):

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

REDIGERA :Här är en enkel (som i, "inte på djupet") förklaring av frågan.

  1. length (regexp_replace(t.error, '[^,]+')) + 1 använder regexp_replace för att radera allt som inte är avgränsaren (komma i det här fallet) och length +1 för att få hur många element (fel) som finns.
  2. select level from dual connect by level <= (...) använder en hierarkisk fråga för att skapa en kolumn med ett ökande antal träffar hittade, från 1 till det totala antalet fel.

    Förhandsgranskning:

    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)) gör en del gjutning av orakeltyper.
    • cast(multiset(.....)) as sys.OdciNumberList omvandlar flera samlingar (en samling för varje rad i den ursprungliga datamängden) till en enda samling nummer, OdciNumberList.
    • table() funktion omvandlar en samling till en resultatuppsättning.
  4. FROM utan anslutning skapar en korskoppling mellan din datauppsättning och multiuppsättningen. Som ett resultat kommer en rad i datamängden med fyra matchningar att upprepas fyra gånger (med ett ökande antal i kolumnen med namnet "column_value").

    Förhandsgranskning:

    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)) använder column_value som nth_appearance/ocurrence parameter för regexp_substr .
  6. Du kan lägga till några andra kolumner från din datamängd (t.name, t.project som ett exempel) för enkel visualisering.

Några referenser till Oracle-dokument:

  • REGEXP_REPLACE
  • REGEXP_SUBSTR
  • Utökbarhetskonstanter, typer och mappningar (OdciNumberList)
  • CAST (multiset)
  • Hierarkiska frågor


  1. Vilken är den bästa metoden för att skicka parametrar till SQLCommand?

  2. Återställ tabellstruktur från frm- och ibd-filer

  3. Autogenererar svarsfil

  4. Grundläggande administration Jämförelse mellan Oracle, MSSQL, MySQL, PostgreSQL