Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menukar Nilai Dipisahkan Koma ke Baris dalam 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!