Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dzielenie ciągu na wiele wierszy w Oracle

Może to być lepszy sposób (także z regexp i 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

EDYTUJ :Oto proste (jak w „nie dogłębnym”) wyjaśnienie zapytania.

  1. length (regexp_replace(t.error, '[^,]+')) + 1 używa regexp_replace aby usunąć wszystko, co nie jest ogranicznikiem (w tym przypadku przecinkiem) i length +1 aby uzyskać liczbę elementów (błędów).
  2. select level from dual connect by level <= (...) używa zapytania hierarchicznego aby utworzyć kolumnę z rosnącą liczbą znalezionych dopasowań, od 1 do całkowitej liczby błędów.

    Podgląd:

    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)) wykonuje pewne rzucanie typów wyroczni.
    • cast(multiset(.....)) as sys.OdciNumberList przekształca wiele kolekcji (jeden zbiór dla każdego wiersza w oryginalnym zestawie danych) w pojedynczy zbiór liczb, OdciNumberList.
    • table() funkcja przekształca kolekcję w zestaw wyników.
  4. FROM bez sprzężenia tworzy połączenie krzyżowe między zbiorem danych a zbiorem multiset.W rezultacie wiersz w zestawie danych z 4 dopasowaniami powtórzy się 4 razy (ze wzrastającą liczbą w kolumnie o nazwie "wartość_kolumny").

    Podgląd:

    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)) używa column_value jako nth_appearance/ocurrence parametr dla regexp_substr .
  6. Możesz dodać kilka innych kolumn ze swojego zestawu danych (t.name, t.project jako przykład) dla łatwej wizualizacji.

Kilka odniesień do dokumentów Oracle:

  • REGEXP_REPLACE
  • REGEXP_SUBSTR
  • Stałe, typy i mapowania rozszerzalności (OdciNumberList)
  • CAST (multiset)
  • Zapytania hierarchiczne


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-00054:zasób zajęty i pozyskiwanie za pomocą NOWIT określone

  2. Dlaczego uruchomienie tego zapytania z EXECUTE IMMEDIATE powoduje jego niepowodzenie?

  3. Funkcja PL/SQL w Oracle nie widzi DBMS_AQ

  4. Warunkowo zdefiniuj kursor

  5. Wygeneruj zakres dat z dwóch kolumn dat