Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Memisahkan Rentetan Dipisahkan Koma kepada Berbilang Baris dalam Oracle?

Bagaimana untuk Memisahkan Rentetan Dipisahkan Koma kepada Berbilang Baris dalam Oracle?

Susan Sarandon
Susan Sarandonasal
2025-01-22 17:51:12510semak imbas

How to Split Comma-Separated Strings into Multiple Rows in Oracle?

Pisah rentetan dipisahkan koma kepada berbilang baris dalam Oracle

Dalam Oracle, anda boleh memisahkan rentetan yang dipisahkan koma kepada berbilang baris menggunakan gabungan ungkapan biasa dan pertanyaan hierarki. Berikut ialah panduan lengkap tentang cara mencapai matlamat ini:

Pernyataan Masalah:

Andaikan terdapat jadual dengan struktur berikut:

<code>名称 | 项目 | 错误
--------------
108  | test    | Err1, Err2, Err3
109  | test2   | Err1</code>

Anda ingin menukar lajur "ralat" kepada berbilang baris, hasilnya adalah seperti berikut:

<code>名称 | 项目 | 错误
--------------
108  | test    | Err1
108  | test    | Err2
108  | test    | Err3
109  | test2   | Err1</code>

Penyelesaian:

<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 <= regexp_count(t.error, ',')) as OdciNumberList)) levels
;</code>

Arahan:

  1. Buat jadual sementara: Cipta jadual TEMP untuk menyimpan data sampel.
  2. Gunakan pertanyaan hierarki: Subkueri select level from dual connect by level <= regexp_count(t.error, ',') menjana urutan nombor yang panjangnya sama dengan bilangan koma dalam rentetan tambah satu (iaitu bilangan ralat).
  3. Hantar dan jadual: Fungsi table() dan cast() menukar pertanyaan hierarki kepada koleksi senarai angka dan kemudian menjadi jadual. Ini akan menghasilkan baris dengan bilangan yang semakin meningkat sepadan dengan setiap baris dalam jadual TEMP.
  4. Ekstrak nilai ralat: Fungsi regexp_substr() digunakan untuk mengekstrak nilai ralat tunggal berdasarkan nombor daripada langkah sebelumnya. Fungsi trim() mengalih keluar sebarang ruang kosong di hadapan atau di belakang.
  5. Sertai dan Pilih: Pertanyaan utama bergabung dengan jadual TEMP dengan jadual yang dibuat dalam langkah 4 dan memilih lajur yang sepadan: Nama, Projek dan Ralat.

Nota: Penyelesaian ini menggunakan jenis OdciNumberList dan mungkin memerlukan penetapan tetapan keserasian jika menggunakan versi Oracle lebih awal daripada 12c.

Atas ialah kandungan terperinci Bagaimana untuk Memisahkan Rentetan Dipisahkan Koma kepada Berbilang Baris dalam Oracle?. 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