Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Menukar Nilai Dipisahkan Koma dengan Cekap kepada Baris dalam Oracle SQL?
Mengatur data dalam rekod pangkalan data sebagai nilai yang dipisahkan koma mewujudkan cabaran apabila mencari perwakilan jadual. Artikel ini meneroka beberapa teknik SQL untuk menukar data sedemikian dengan cekap kepada baris untuk pengekstrakan dan manipulasi data yang mudah.
Pertimbangkan struktur jadual berikut, di mana lajur nilai mengandungi nilai dipisahkan koma:
<code>CREATE TABLE tbl1 ( id NUMBER, value VARCHAR2(50) ); INSERT INTO tbl1 VALUES (1, 'AA, UT, BT, SK, SX'); INSERT INTO tbl1 VALUES (2, 'AA, UT, SX'); INSERT INTO tbl1 VALUES (3, 'UT, SK, SX, ZF');</code>
Matlamatnya adalah untuk menukar data ini kepada format jadual, dengan setiap nilai dipisahkan ke dalam barisnya sendiri:
<code>ID | VALUE ------------- 1 | AA 1 | UT 1 | BT 1 | SK 1 | SX 2 | AA 2 | UT 2 | SX 3 | UT 3 | SK 3 | SX 3 | ZF</code>
Salah satu cara ialah memanfaatkan klausa REGEXP_SUBSTR Oracle dan CONNECT BY:
<code>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>
Kaedah ini menggunakan ungkapan biasa (REGEXP_SUBSTR) untuk mengekstrak setiap subrentetan, manakala CONNECT BY melelaran pada nilai yang dipisahkan koma secara rekursif.
Teknik lain ialah menggunakan ungkapan jadual biasa (CTE) dengan kesatuan rekursif:
<code>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>
Kaedah ini menggunakan CTE rekursif untuk memecahkan nilai yang dipisahkan koma ke dalam elemen individu.
Penyelesaian ketiga menggunakan CTE rekursif dengan fungsi INSTR untuk mengenal pasti kedudukan mula dan akhir setiap subrentetan:
<code>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>
Kaedah ini menggunakan INSTR untuk menentukan secara rekursif kedudukan setiap subrentetan dan mengekstraknya dengan sewajarnya.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menukar Nilai Dipisahkan Koma dengan Cekap kepada Baris dalam Oracle SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!