Rumah > pangkalan data > tutorial mysql > Bagaimanakah saya boleh memisahkan nilai lajur tunggal yang mengandungi berbilang segmen data ke dalam lajur berasingan dalam pangkalan data dengan cekap?

Bagaimanakah saya boleh memisahkan nilai lajur tunggal yang mengandungi berbilang segmen data ke dalam lajur berasingan dalam pangkalan data dengan cekap?

Patricia Arquette
Lepaskan: 2024-12-17 10:41:24
asal
508 orang telah melayarinya

How can I efficiently split a single column value containing multiple data segments into separate columns in a database?

Memisahkan Nilai Lajur Tunggal kepada Berbilang Lajur

Dalam pangkalan data, tugas biasa ialah membahagikan nilai lajur tunggal yang mengandungi berbilang keping maklumat ke dalam lajur yang berasingan. Artikel ini membentangkan pendekatan dalam talian untuk mencapai transformasi data ini.

Pernyataan Masalah

Kami mempunyai jadual langganan di mana nombor langganan disimpan sebagai nilai tunggal dalam satu lajur. Nombor langganan terdiri daripada berbilang segmen yang dipisahkan oleh sempang dan ruang. Matlamatnya ialah untuk membahagikan nilai ini kepada lajur individu, seperti awalan, segmen 1, segmen 2 dan seterusnya.

Contoh

Pertimbangkan sampel langganan berikut nombor:

SC 5-1395-174-25P
SC 1-2134-123-ABC C1-2
SC 12-5245-1247-14&P
SC ABCD-2525-120
Salin selepas log masuk

Penyelesaian

Berikut ialah pertanyaan dalam talian yang menyelesaikan pemisahan:

Declare @YourTable table (SomeCol varchar(max))
Insert Into @YourTable values
('SC 5-1395-174-25P'),
('SC 1-2134-123-ABC C1-2'),
('SC 12-5245-1247-14&P'),
('SC ABCD-2525-120')


Select B.*
 From  @YourTable A
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                      ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                      ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
                      ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
                      ,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
                From  (Select Cast('<x>' + replace((Select replace(replace(A.SomeCol,' ','-'),'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B
Salin selepas log masuk

Keputusan

Output pertanyaan adalah sebagai berikut:

+---------+---------+---------+---------+---------+---------+---------+
| COL1    | COL2    | COL3    | COL4    | COL5    | COL6    | COL7    |
+---------+---------+---------+---------+---------+---------+---------+
| SC      | 5       | 1395    | 174     | 25P     | NULL    | NULL    |
| SC      | 1       | 2134    | 123     | ABC     | C1      | 2       |
| SC      | 12      | 5245    | 1247    | 14&P    | NULL    | NULL    |
| SC      | ABCD    | 2525    | 120     | NULL    | NULL    | NULL    |
+---------+---------+---------+---------+---------+---------+---------+
Salin selepas log masuk

Penjelasan

Pertanyaan menggunakan tanda silang untuk membuat set baris bagi setiap segmen dalam nombor langganan. Ungkapan laluan xml '/x[1]' mengekstrak segmen pertama, '/x[2]' mengekstrak segmen kedua dan seterusnya. Fungsi ltrim dan rtrim digunakan untuk membersihkan mana-mana ruang putih di hadapan atau di belakang.

Pendekatan Ganti

Anda juga boleh mencipta jadual baharu dengan segera untuk menyimpan pembahagian nilai:

Declare @YourTable table (PUB_FORM_NUM varchar(max))
Insert Into @YourTable values
('SC 5-1395-174-25P'),
('SC 1-2134-123-ABC C1-2'),
('SC 12-5245-1247-14&P'),
('SC ABCD-2525-120')

Select A.PUB_FORM_NUM
      ,B.*
 Into  MyNewPubTable
 From  @YourTable A
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                      ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                      ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
                      ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
                      ,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
                From  (Select Cast('<x>' + replace((Select replace(replace(A.PUB_FORM_NUM,' ','-'),'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

Select * From MyNewPubTable
Salin selepas log masuk

Kesimpulan

Yang disediakan pendekatan dalam talian ialah penyelesaian serba boleh untuk mengekstrak berbilang segmen daripada nilai lajur tunggal. Ia boleh disesuaikan dengan mudah untuk memenuhi keperluan data khusus anda.

Atas ialah kandungan terperinci Bagaimanakah saya boleh memisahkan nilai lajur tunggal yang mengandungi berbilang segmen data ke dalam lajur berasingan dalam pangkalan data dengan cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan