Operasi pangkalan data selalunya memerlukan pemisahan rentetan ke dalam baris individu. Oracle menawarkan kaedah yang berkesan, terutamanya dalam versi 10g dan lebih baru, untuk mengurus tugas ini.
Teknik yang ringkas tetapi berkuasa menggunakan ungkapan biasa dan klausa connect by
. Ini melibatkan membina jadual sementara dan menggunakan fungsi ungkapan biasa untuk mengekstrak subrentetan:
<code class="language-sql">with temp as ( select 108 Name, 'test' Project, 'Err1, Err2, Err3' Error from dual union all select 109, 'test2', 'Err1' from dual ) select distinct t.name, t.project, trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value)) as error from temp t, table(cast(multiset(select level from dual connect by level <= length(regexp_replace(t.error, '[^,]+')) + 1) as sys.OdciNumberList)) levels;</code>
temp
CTE (Ungkapan Jadual Biasa) mensimulasikan data sampel.length(regexp_replace(t.error, '[^,] ')) 1
menentukan bilangan ralat dengan mengira nilai yang dipisahkan koma.select level from dual connect by level <= ...
menjana urutan nombor dari 1 hingga kiraan ralat.table(cast(multiset(...) as sys.OdciNumberList))
menukar urutan nombor menjadi koleksi yang boleh digunakan.temp
dengan koleksi nombor, mewujudkan semua gabungan yang diperlukan.trim(regexp_substr(t.error, '[^,] ', 1, levels.column_value))
mengekstrak setiap ralat menggunakan nombor yang dijana sebagai penunjuk kedudukan.Kaedah ini memisahkan rentetan dengan berbilang nilai dengan cekap ke dalam baris yang berasingan sambil mengekalkan integriti data.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membahagikan Rentetan kepada Berbilang Baris dengan Cekap dalam Oracle?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!