sql >> Databáze >  >> RDS >> Oracle

rozdělit řetězec do několika řad

Z vašeho komentáře k odpovědi @PrzemyslawKruglej

Hlavní problém je s interním dotazem s connect by generuje úžasné množství řádků

Množství generovaných řádků lze snížit následujícím postupem:

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

Výsledek:Pro tři řádky, kde nejdelší z nich je tvořen třemi slovy, vygenerujeme 9 řádků :

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

Poslední dotaz:

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;

Výsledek:

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

Ukázka SQLFIddle

Zjistěte více o funkcích regulárních výrazů regexp_count()(11g a vyšší) a regexp_substr().

Poznámka: Funkce regulárních výrazů jsou poměrně drahé na výpočet a pokud jde o zpracování velkého množství dat, možná by stálo za zvážení přejít na obyčejný PL/SQL. Zde je příklad.



  1. Správa transakcí s Django 1.6

  2. Jak namapovat řetězec na DB sekvenci v Hibernate

  3. Schéma nelze zrušit, protože neexistuje nebo nemáte oprávnění. - SQL Server / Výukový program TSQL, část 29

  4. Jak najít všechny tabulky, které mají cizí klíče, které odkazují na konkrétní table.column a mají hodnoty pro tyto cizí klíče?