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?
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
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
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 | +---------+---------+---------+---------+---------+---------+---------+
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
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!