Oracle
 sql >> база данни >  >> RDS >> Oracle

разделете низа на няколко реда

От вашия коментар към @PrzemyslawKruglej отговор

Основният проблем е с вътрешната заявка с connect by , генерира удивително количество редове

Количеството генерирани редове може да бъде намалено със следния подход:

/* 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;

Резултат:За три реда, където най-дългият е съставен от три думи, ще генерираме 9 реда :

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

Последна заявка:

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;

Резултат:

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

SQLFIddle Демо

Научете повече за функциите на regexp_count()(11g и нагоре) и regexp_substr().

Забележка: Функциите на регулярните изрази са относително скъпи за изчисляване и когато става въпрос за обработка на много голямо количество данни, може да си струва да се помисли за преминаване към обикновен PL/SQL. Ето един пример.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ляво и дясно се свързват с помощта на знака плюс (+) в Oracle

  2. Как да настроите или тествате производителността на PLSQL кода в Oracle D2k Forms

  3. Пример за задействане на Oracle WHEN

  4. Как да изпълним процедура с процедурата DBMS_SCHEDULER.CREATE_JOB

  5. Списък с NLS параметри в базата данни на Oracle