Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Menukar Nilai Dipisahkan Koma dengan Cekap kepada Baris dalam Oracle SQL?

Bagaimanakah Saya Boleh Menukar Nilai Dipisahkan Koma dengan Cekap kepada Baris dalam Oracle SQL?

Susan Sarandon
Susan Sarandonasal
2025-01-22 18:57:10603semak imbas

How Can I Efficiently Convert Comma-Separated Values into Rows in Oracle SQL?

Strategi penukaran nilai dipisahkan koma 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.

Isu: Nilai dipisahkan koma dalam rekod pangkalan data

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>

Kaedah 1: Gunakan REGEXP_SUBSTR dan Sambung Dengan

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.

Kaedah 2: CTE menggunakan kesatuan 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.

Kaedah 3: Menggunakan kaedah rekursif INSTR

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!

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