sql >> Databasteknik >  >> RDS >> Oracle

dela strängen i flera rader

Från din kommentar till @PrzemyslawKruglej svar

Huvudproblemet är med intern fråga med connect by , det genererar en häpnadsväckande mängd rader

Mängden genererade rader kan minskas med följande tillvägagångssätt:

/* 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:För tre rader där den längsta består av tre ord, genererar vi 9 rader :

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

Slutlig fråga:

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

Ta reda på mer om regexp_count()(11g och uppåt) och regexp_substr() reguljära uttrycksfunktioner.

Obs! Reguljära uttryck fungerar relativt dyrt att beräkna, och när det kommer till att bearbeta en mycket stor mängd data kan det vara värt att överväga att byta till en vanlig PL/SQL. Här är ett exempel.



  1. Hur parallella planer startar – del 3

  2. Joomla SQL Injection sårbarhet

  3. Hur RIGHT() fungerar i MariaDB

  4. Hur man kontrollerar en databas kompatibilitetsnivå i SQL Server med T-SQL