Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menukar Nilai Dipisahkan Koma ke Baris dalam Oracle?

Bagaimana untuk Menukar Nilai Dipisahkan Koma ke Baris dalam Oracle?

DDD
DDDasal
2025-01-22 19:11:09336semak imbas

How to Convert Comma-Separated Values into Rows in Oracle?

Tukar nilai dipisahkan koma ke baris dalam Oracle

Koma ialah pembatas biasa untuk mewakili berbilang nilai sebagai rentetan tunggal, tetapi apabila bekerja dengan data dalam Oracle, anda mungkin perlu memisahkan nilai ini ke dalam baris yang berbeza. Ini boleh dicapai dalam pelbagai cara.

Pertanyaan rekursif menggunakan ungkapan biasa

Salah satu cara ialah menggunakan pertanyaan rekursif dengan ungkapan biasa untuk mengekstrak setiap nilai:

<code class="language-sql">select distinct id, trim(regexp_substr(value, '[^,]+', 1, level) ) value, level
from tbl1
connect by regexp_substr(value, '[^,]+', 1, level) is not null
order by id, level;</code>

Pertanyaan ini menggunakan fungsi REGEXP_SUBSTR untuk mengekstrak setiap subrentetan bukan koma dan kemudian menggabungkan hasil menggunakan pertanyaan rekursif.

Pertanyaan rekursif tanpa ungkapan biasa

Satu lagi pendekatan rekursif yang mengelakkan penggunaan ungkapan biasa:

<code class="language-sql">WITH t ( id, value, start_pos, end_pos ) AS
  ( SELECT id, value, 1, INSTR( value, ',' ) FROM tbl1
  UNION ALL
  SELECT id,
    value,
    end_pos                    + 1,
    INSTR( value, ',', end_pos + 1 )
  FROM t
  WHERE end_pos > 0
  )
SELECT id,
  SUBSTR( value, start_pos, DECODE( end_pos, 0, LENGTH( value ) + 1, end_pos ) - start_pos ) AS value
FROM t
ORDER BY id,
  start_pos;</code>

Pertanyaan ini menggunakan fungsi INSTR untuk mencari kedudukan koma, dan kemudian menggunakan fungsi SUBSTR untuk mengekstrak nilai individu.

CTE menggunakan kesatuan rekursif

Kaedah ketiga menggunakan ungkapan jadual biasa (CTE) dengan kesatuan rekursif:

<code class="language-sql">with t (id,res,val,lev) as (
           select id, trim(regexp_substr(value,'[^,]+', 1, 1 )) res, value as val, 1 as lev
             from tbl1
            where regexp_substr(value, '[^,]+', 1, 1) is not null
            union all           
            select id, trim(regexp_substr(val,'[^,]+', 1, lev+1) ) res, val, lev+1 as lev
              from t
              where regexp_substr(val, '[^,]+', 1, lev+1) is not null
              )
select id, res,lev
  from t
order by id, lev;</code>

Pertanyaan ini menggunakan operator UNION ALL untuk mencipta CTE rekursif yang mengekstrak setiap subrentetan bukan koma.

Atas ialah kandungan terperinci Bagaimana untuk Menukar Nilai Dipisahkan Koma ke 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