Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Membahagikan Rentetan Dibatasi Koma kepada Berbilang Baris dalam Oracle 10g dan 11g?
Memisahkan Rentetan Dipisahkan Koma ke Baris dengan Cekap dalam Oracle 10g dan 11g
Oracle menawarkan beberapa kaedah untuk memisahkan rentetan yang dipisahkan koma ke dalam baris individu. Pendekatan yang dipertingkatkan ini memanfaatkan ungkapan biasa dan klausa CONNECT BY
untuk penyelesaian yang lebih cekap:
<code class="language-sql">WITH temp AS ( SELECT 108 AS Name, 'test' AS Project, 'Err1, Err2, Err3' AS 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 OdciNumberList)) levels</code>
Penjelasan Terperinci:
Pertanyaan ini menggunakan pertanyaan hierarki untuk mencapai pemisahan rentetan. Jom pecahkan langkahnya:
Data Contoh: Klausa WITH
mentakrifkan jadual sampel (temp
) yang mengandungi rentetan ralat dipisahkan koma.
Kiraan Pembatas: LENGTH(REGEXP_REPLACE(t.error, '[^,] ')) 1
mengira bilangan koma tambah satu (untuk mengambil kira elemen terakhir). Ini menentukan bilangan baris yang diperlukan.
Menjana Jujukan: SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= ...
menjana jujukan nombor daripada 1 sehingga kiraan unsur. CONNECT BY
adalah penting untuk mencipta jujukan ini.
Penciptaan Koleksi: MULTISET(...)
mencipta koleksi (satu set nombor) daripada jujukan yang dijana. CAST(... AS OdciNumberList)
menukar ini kepada jenis koleksi Oracle.
Transformasi Jadual: TABLE(...)
mengubah koleksi menjadi set hasil, membolehkan kami menyertainya dengan jadual temp
.
Pengeluaran Rentetan: REGEXP_SUBSTR(t.error, '[^,] ', 1, levels.column_value)
mengekstrak setiap subrentetan yang dipisahkan koma. [^,]
ialah ungkapan biasa yang sepadan dengan satu atau lebih aksara bukan koma. levels.column_value
memberikan nombor kejadian untuk pengekstrakan.
Pemangkasan dan Penyahduplikasi: TRIM(...)
mengalih keluar ruang hadapan/belakang. SELECT DISTINCT
menghapuskan baris pendua, memastikan setiap ralat muncul sekali sahaja.
Pendekatan ini cekap kerana ia mengelakkan gelung dan menggunakan fungsi terbina dalam Oracle untuk prestasi yang dioptimumkan. Ungkapan biasa menyediakan kaedah yang mantap untuk mengendalikan panjang rentetan yang berbeza-beza dan kemungkinan penyelewengan dalam data yang dipisahkan koma.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membahagikan Rentetan Dibatasi Koma kepada Berbilang Baris dalam Oracle 10g dan 11g?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!