sql >> Database >  >> RDS >> Oracle

String splitsen in meerdere rijen in Oracle

Dit kan een verbeterde manier zijn (ook met regexp en 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

BEWERKEN :Hier is een eenvoudige (zoals in, "niet diepgaand") uitleg van de vraag.

  1. length (regexp_replace(t.error, '[^,]+')) + 1 gebruikt regexp_replace om alles te wissen dat niet het scheidingsteken is (komma in dit geval) en length +1 om te zien hoeveel elementen (fouten) er zijn.
  2. Het select level from dual connect by level <= (...) gebruikt een hiërarchische zoekopdracht om een ​​kolom te maken met een toenemend aantal gevonden overeenkomsten, van 1 tot het totale aantal fouten.

    Voorbeeld:

    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)) doet wat casting van orakeltypes.
    • De cast(multiset(.....)) as sys.OdciNumberList transformeert meerdere verzamelingen (één verzameling voor elke rij in de originele dataset) in een enkele verzameling getallen, OdciNumberList.
    • De table() functie transformeert een verzameling in een resultatenset.
  4. FROM zonder een join maakt een cross join tussen uw dataset en de multiset. Als resultaat wordt een rij in de dataset met 4 overeenkomsten 4 keer herhaald (met een toenemend aantal in de kolom met de naam "column_value").

    Voorbeeld:

    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)) gebruikt de column_value als de nth_appearance/ocurrence parameter voor regexp_substr .
  6. U kunt enkele andere kolommen uit uw dataset toevoegen (t.name, t.project als voorbeeld) voor eenvoudige visualisatie.

Enkele verwijzingen naar Oracle-documenten:

  • REGEXP_REPLACE
  • REGEXP_SUBSTR
  • Uitbreidbaarheidsconstanten, typen en toewijzingen (OdciNumberList)
  • CAST (multiset)
  • Hiërarchische zoekopdrachten


  1. Programmatisch een database maken in SQL Server

  2. Hoe ODP.NET 2.111 en ODP.NET 4.112 op dezelfde machine naast elkaar te installeren, terwijl beide naar dezelfde databaseserver verwijzen

  3. Database-e-mail configureren in SQL Server

  4. TSQL:Hoe kan ik lokale tijd naar UTC converteren? (SQL-server 2008)