Rumah > pangkalan data > tutorial mysql > Bagaimanakah saya boleh membahagikan nilai lajur tunggal yang mengandungi berbilang nilai kepada berbilang lajur dalam SQL Server?

Bagaimanakah saya boleh membahagikan nilai lajur tunggal yang mengandungi berbilang nilai kepada berbilang lajur dalam SQL Server?

Susan Sarandon
Lepaskan: 2024-12-23 19:13:09
asal
239 orang telah melayarinya

How can I split a single column value containing multiple values into multiple columns in SQL Server?

Memisahkan Nilai Lajur Tunggal kepada Berbilang Lajur

Tugas membahagikan lajur tunggal yang mengandungi berbilang nilai kepada lajur berasingan boleh timbul dalam pengurusan data . Sebagai contoh, pertimbangkan jadual dengan lajur bernama "SubscriptionNumber" yang menyimpan butiran langganan dalam satu medan. Untuk menjadikan data lebih mudah diurus dan boleh diakses, kita perlu mengekstrak nilai individu ke dalam berbilang lajur.

Pendekatan Menggunakan Cross Apply dan XML

Satu kaedah untuk mencapai ini ialah dengan menggunakan teknik manipulasi silang dan manipulasi XML. Katakan kita mempunyai jadual yang dipanggil "Langganan" dengan lajur "Nombor Langganan". Data sampel dalam lajur ini adalah seperti berikut:

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

Untuk membahagikan nilai ini kepada lajur yang berasingan, kami boleh menggunakan pertanyaan berikut:

Declare @YourTable table (SubscriptionNumber 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.SubscriptionNumber,' ','-'),'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B
Salin selepas log masuk

Pertanyaan ini menggunakan pangkah untuk jana satu set baris untuk setiap baris dalam jadual @YourTable. Dalam penggunaan silang, jenis data XML digunakan untuk menukar nilai SubscriptionNumber menjadi serpihan XML. Serpihan XML kemudiannya dihuraikan untuk mengekstrak nilai individu dan menetapkannya pada lajur Pos1 hingga Pos7.

Pendekatan Alternatif Menggunakan SQL Dinamik

Pendekatan SQL dinamik juga boleh digunakan untuk memisahkan lajur SubscriptionNumber kepada berbilang lajur. Pendekatan ini memerlukan penciptaan jadual sementara untuk menyimpan nilai pecahan:

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

Declare @ColNames nvarchar(max) = ''
Declare @SQL nvarchar(max) = 'CREATE TABLE #TempTable (SubscriptionNumber varchar(max), '

-- Generate column names dynamically
Select @ColNames += ', Col' + CAST(Row_Number() OVER (ORDER BY (SELECT NULL)) AS nvarchar(10))
From (Select * From @YourTable) AS T
Cross Join (Select * From @YourTable) AS T2

-- Append column names to SQL statement
Set @SQL += @ColNames + ')'

-- Execute the dynamic SQL to create the temporary table
Exec (@SQL)

-- Insert split values into the temporary table
Insert Into #TempTable
Select SubscriptionNumber,
       ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
     , ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
     , ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
     , ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
     , ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
     , ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
     , ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
From @YourTable
Cross Apply (
                Select Cast('<x>' + replace((Select replace(replace(SubscriptionNumber,' ','-'),'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 

-- Select data from the temporary table
Select * From #TempTable
Salin selepas log masuk

Pendekatan SQL dinamik menjana pernyataan SQL secara dinamik untuk mencipta jadual sementara dengan nama lajur yang sesuai. Nilai pecahan kemudiannya dimasukkan ke dalam jadual sementara ini dan data boleh dipilih daripada jadual sementara seperti yang diperlukan.

Atas ialah kandungan terperinci Bagaimanakah saya boleh membahagikan nilai lajur tunggal yang mengandungi berbilang nilai kepada berbilang lajur dalam SQL Server?. 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