sql >> Database teknologi >  >> RDS >> Oracle

Opdeling af streng i flere rækker i Oracle

Dette kan være en forbedret måde (også med regexp og 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

REDIGER :Her er en simpel (som i, "ikke i dybden") forklaring af forespørgslen.

  1. length (regexp_replace(t.error, '[^,]+')) + 1 bruger regexp_replace for at slette alt, der ikke er afgrænsningstegnet (komma i dette tilfælde) og length +1 for at få, hvor mange elementer (fejl) der er.
  2. select level from dual connect by level <= (...) bruger en hierarkisk forespørgsel for at oprette en kolonne med et stigende antal fundne matches fra 1 til det samlede antal fejl.

    Eksempel:

    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)) laver nogle støbninger af orakeltyper.
    • cast(multiset(.....)) as sys.OdciNumberList omdanner flere samlinger (én samling for hver række i det originale datasæt) til en enkelt samling af tal, OdciNumberList.
    • table() funktion omdanner en samling til et resultatsæt.
  4. FROM uden en join oprettes en kryds joinforbindelse mellem dit datasæt og multisættet. Som et resultat vil en række i datasættet med 4 match gentages 4 gange (med et stigende antal i kolonnen kaldet "column_value").

    Eksempel:

    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)) bruger column_value som nth_appearance/ocurrence parameter for regexp_substr .
  6. Du kan tilføje nogle andre kolonner fra dit datasæt (t.name, t.project som et eksempel) for nem visualisering.

Nogle referencer til Oracle-dokumenter:

  • REGEXP_REPLACE
  • REGEXP_SUBSTR
  • Udvidelseskonstanter, typer og tilknytninger (OdciNumberList)
  • CAST (multiset)
  • Hierarkiske forespørgsler


  1. Hvordan ændrer man en kolonne og ændrer standardværdien?

  2. Maksimal længde for tekst af MySQL-typen

  3. Er der nogen grund til at bekymre sig om kolonnerækkefølgen i en tabel?

  4. Hvornår er det tid til at opgradere til SQL?