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

podziel sznurek na kilka rzędów

Od Twojego komentarza do odpowiedzi @PrzemyslawKruglej

Główny problem to wewnętrzne zapytanie z connect by , generuje zadziwiającą ilość wierszy

Liczbę generowanych wierszy można zmniejszyć, stosując następujące podejście:

/* test table populated with sample data from your question */
SQL> create table t1(str) as(
  2    select 'a;b;c'  from dual union all
  3    select 'b;c;d'  from dual union all
  4    select 'a;c;d'  from dual
  5  );
Table created

--  number of rows generated will solely depend on the most longest 
--  string. 
--  If (say) the longest string contains 3 words (wont count separator `;`)
--  and we have 100 rows in our table, then we will end up with 300 rows 
--  for further processing , no more.
with occurrence(ocr) as( 
  select level 
    from ( select max(regexp_count(str, '[^;]+')) as mx_t
             from t1 ) t
    connect by level <= mx_t 
)
select count(regexp_substr(t1.str, '[^;]+', 1, o.ocr)) as generated_for_3_rows
  from t1
 cross join occurrence o;

Wynik:Dla trzech wierszy, z których najdłuższy składa się z trzech słów, wygenerujemy 9 wierszy :

GENERATED_FOR_3_ROWS
--------------------
                  9

Ostatnie zapytanie:

with occurrence(ocr) as( 
  select level 
    from ( select max(regexp_count(str, '[^;]+')) as mx_t
             from t1 ) t
    connect by level <= mx_t 
)
select res
     , count(res) as cnt
  from (select regexp_substr(t1.str, '[^;]+', 1, o.ocr) as res
          from t1
         cross join occurrence o)
 where res is not null
 group by res
 order by res;

Wynik:

RES          CNT
----- ----------
a              2
b              2
c              3
d              2

Prezentacja SQLFIddle

Dowiedz się więcej o funkcjach wyrażeń regularnych regexp_count() (od 11g) i regexp_substr().

Uwaga: Funkcje wyrażeń regularnych są stosunkowo drogie w obliczeniach, a jeśli chodzi o przetwarzanie bardzo dużej ilości danych, warto rozważyć przejście na zwykły PL/SQL. Oto przykład.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pobierz wiersz, który ma maksymalną wartość dla kolumny

  2. Jak rozwiązać brakujące wyrażenie ORA-00936

  3. Jak zainstalować program SQL Developer na komputerze Mac?

  4. Jak wyeksportować dane pola clob w Oracle sql developer

  5. Usługi baz danych na AWS i Oracle Cloud Platform