Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Memecah Lajur Dipisahkan Koma kepada Baris Menggunakan DB2 SQL?

Bagaimana untuk Memecah Lajur Dipisahkan Koma kepada Baris Menggunakan DB2 SQL?

Patricia Arquette
Patricia Arquetteasal
2024-12-20 08:40:09356semak imbas

How to Break Down Comma-Separated Columns into Rows Using DB2 SQL?

Memecahkan Lajur Dipisahkan Koma menjadi Baris dengan DB2

Dalam bidang pengurusan pangkalan data, pengendalian nilai yang dipisahkan koma selalunya boleh menimbulkan cabaran, terutamanya apabila ia datang untuk mengekstrak nilai individu ke dalam baris yang berasingan. Satu senario sedemikian timbul apabila jadual mengandungi lajur dengan rujukan dipisahkan koma, dan timbul keperluan untuk memisahkan rujukan ini kepada baris individu.

Pernyataan Masalah

Pertimbangkan jadual dengan struktur berikut:

Id | FK_ID | Reference
-----------------------
1 | 2100 | GI2, GI32
2 | 2344 | GI56

Matlamatnya adalah untuk mengubah data ini kepada yang berikut output yang diingini:

Id | FK_ID | Reference
-----------------------
1 | 2100 | GI2
2 | 2100 | GI32
3 | 2344 | GI56

Penyelesaian DB2

Untuk mencapai transformasi data ini, DB2 menyediakan pernyataan SQL rekursif yang secara berulang memisahkan nilai yang dipisahkan koma ke dalam baris individu. Penyelesaian itu memanfaatkan kod SQL berikut:

WITH unpivot (lvl, id, fk_ref, reference, tail) AS (  
  SELECT 1, id, fk_ref,     
         CASE WHEN LOCATE(',',reference) > 0 
              THEN TRIM(LEFT(reference, LOCATE(',',reference)-1))
              ELSE TRIM(reference) 
         END,    
         CASE WHEN LOCATE(',',reference) > 0 
              THEN SUBSTR(reference, LOCATE(',',reference)+1)    
              ELSE '' 
         END  
  FROM yourtable  
  UNION ALL  
  SELECT lvl + 1, id, fk_ref,     
         CASE WHEN LOCATE(',', tail) > 0 
              THEN TRIM(LEFT(tail, LOCATE(',', tail)-1))    
              ELSE TRIM(tail) 
         END,    
         CASE WHEN LOCATE(',', tail) > 0 
              THEN SUBSTR(tail, LOCATE(',', tail)+1)    
              ELSE '' 
         END
  FROM unpivot 
  WHERE lvl < 100 AND tail != '')
  SELECT id, fk_ref, reference FROM unpivot

Penjelasan

CTE rekursif (Ungkapan Jadual Biasa) yang dinamakan unpivot menggunakan klausa UNION ALL untuk memisahkan Rujukan secara berulang lajur ke dalam nilai individu:

  • lvl mewakili tahap rekursi, yang memastikan proses pemisahan ditamatkan selepas maksimum 100 tahap.
  • Barisan pertama CTE memilih token pertama daripada lajur Rujukan sebagai nilai awal untuk rujukan, dan rentetan selebihnya sebagai ekor .
  • Barisan seterusnya menggunakan ekor dari baris sebelumnya sebagai rujukan dan ulangi proses membelah sehingga ekor kosong atau maksimum tahap rekursi dicapai.
  • Akhir sekali, pernyataan SELECT di luar CTE mengekstrak id, fk_ref dan lajur rujukan yang diingini daripada CTE nyahpivot.

Nota:

Adalah penting untuk mengelak daripada menyimpan data dalam format yang dipisahkan koma, kerana ini boleh membawa kepada isu integriti data dan menjadikan manipulasi dan pertanyaan data lebih kompleks. Walau bagaimanapun, penyelesaian yang disediakan menawarkan cara untuk mengubah data sedemikian kepada format yang lebih terurus dan boleh digunakan dalam kes yang tidak dapat dielakkan atau perlu.

Atas ialah kandungan terperinci Bagaimana untuk Memecah Lajur Dipisahkan Koma kepada Baris Menggunakan DB2 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