Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

pisahkan string menjadi beberapa baris

Dari komentar Anda hingga jawaban @PrzemyslawKruglej

Masalah utama adalah dengan permintaan internal dengan connect by , ini menghasilkan jumlah baris yang menakjubkan

Jumlah baris yang dihasilkan dapat dikurangi dengan pendekatan berikut:

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

Hasil:Untuk tiga baris di mana yang terpanjang terdiri dari tiga kata, kami akan menghasilkan 9 baris :

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

Permintaan terakhir:

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;

Hasil:

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

Demo SQLFIddle

Cari tahu lebih lanjut tentang fungsi ekspresi reguler regexp_count()(11g dan lebih tinggi) dan regexp_substr().

Catatan: Fungsi ekspresi reguler relatif mahal untuk dihitung, dan ketika harus memproses data dalam jumlah yang sangat besar, mungkin ada baiknya mempertimbangkan untuk beralih ke PL/SQL biasa. Berikut adalah contoh.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tambahkan Kolom yang Mewakili Penggabungan Dua Kolom Varchar Lainnya

  2. Fungsi Numerik di Oracle (Daftar Lengkap)

  3. SUM Bersyarat di Oracle

  4. Cari Tahu Kuartal Mana yang Termasuk Tanggal di Oracle

  5. if (pilih count(kolom) dari tabel)> 0 maka