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

opdele streng i flere rækker

Fra din kommentar til @PrzemyslawKruglej svar

Hovedproblemet er med intern forespørgsel med connect by , det genererer en forbløffende mængde rækker

Mængden af ​​genererede rækker kan reduceres med følgende fremgangsmåde:

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

Resultat:For tre rækker, hvor den længste består af tre ord, genererer vi 9 rækker :

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

Endelig forespørgsel:

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;

Resultat:

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

SQLFIddle-demo

Find ud af mere om regexp_count()(11g og op) og regexp_substr() regulære udtryksfunktioner.

Bemærk: Regulære udtryk fungerer relativt dyre at beregne, og når det kommer til at behandle en meget stor mængde data, kan det være værd at overveje at skifte til en almindelig PL/SQL. Her er et eksempel.



  1. Tips til at reducere din SQL Server-kompleksitet

  2. System.Data.OracleClient kræver Oracle-klientsoftware version 8.1.7

  3. Hurtigste måde at udføre indlejrede masseindsættelser med anvendelse af scope_identity()?

  4. Android adgang til ekstern SQL-database