Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Membahagikan Rentetan Dibatasi Koma kepada Berbilang Baris dalam Oracle 10g dan 11g?

Bagaimanakah Saya Boleh Membahagikan Rentetan Dibatasi Koma kepada Berbilang Baris dalam Oracle 10g dan 11g?

Patricia Arquette
Patricia Arquetteasal
2025-01-22 17:56:13640semak imbas

How Can I Split a Comma-Delimited String into Multiple Rows in Oracle 10g and 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:

  1. Data Contoh: Klausa WITH mentakrifkan jadual sampel (temp) yang mengandungi rentetan ralat dipisahkan koma.

  2. Kiraan Pembatas: LENGTH(REGEXP_REPLACE(t.error, '[^,] ')) 1 mengira bilangan koma tambah satu (untuk mengambil kira elemen terakhir). Ini menentukan bilangan baris yang diperlukan.

  3. 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.

  4. Penciptaan Koleksi: MULTISET(...) mencipta koleksi (satu set nombor) daripada jujukan yang dijana. CAST(... AS OdciNumberList) menukar ini kepada jenis koleksi Oracle.

  5. Transformasi Jadual: TABLE(...) mengubah koleksi menjadi set hasil, membolehkan kami menyertainya dengan jadual temp.

  6. 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.

  7. 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn