>데이터 베이스 >MySQL 튜토리얼 >여러 값이 포함된 단일 열 값을 SQL Server의 여러 열로 분할하려면 어떻게 해야 하나요?

여러 값이 포함된 단일 열 값을 SQL Server의 여러 열로 분할하려면 어떻게 해야 하나요?

Susan Sarandon
Susan Sarandon원래의
2024-12-23 19:13:09218검색

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

단일 열 값을 여러 열로 분할

여러 값이 포함된 단일 열을 별도의 열로 분할하는 작업은 데이터 관리에서 발생할 수 있습니다. . 예를 들어, 단일 필드에 구독 세부 정보를 저장하는 "SubscriptionNumber"라는 열이 있는 테이블을 생각해 보세요. 데이터를 보다 쉽게 ​​관리하고 액세스할 수 있도록 하려면 개별 값을 여러 열로 추출해야 합니다.

교차 적용 및 XML을 사용한 접근 방식

이를 달성하는 한 가지 방법은 다음과 같습니다. 교차 적용 및 XML 조작 기술을 사용합니다. "SubscriptionNumber" 열이 있는 "Subscriptions"라는 테이블이 있다고 가정해 보겠습니다. 이 열의 샘플 데이터는 다음과 같습니다.

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

이러한 값을 별도의 열로 분할하려면 다음 쿼리를 사용할 수 있습니다.

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

이 쿼리는 교차 적용을 사용합니다. @YourTable 테이블의 각 행에 대한 행 집합을 생성합니다. 교차 적용 내에서 XML 데이터 유형은 SubscriptionNumber 값을 XML 조각으로 변환하는 데 사용됩니다. 그런 다음 XML 조각을 구문 분석하여 개별 값을 추출하고 이를 Pos1~Pos7 열에 할당합니다.

동적 SQL을 사용한 대체 접근 방식

동적 SQL 접근 방식도 가능합니다. SubscriptionNumber 열을 여러 열로 분할하는 데 사용됩니다. 이 접근 방식을 사용하려면 분할 값을 저장할 임시 테이블을 생성해야 합니다.

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

동적 SQL 접근 방식은 SQL 문을 동적으로 생성하여 적절한 열 이름이 있는 임시 테이블을 생성합니다. 그런 다음 분할된 값이 이 임시 테이블에 삽입되고 필요에 따라 임시 테이블에서 데이터를 선택할 수 있습니다.

위 내용은 여러 값이 포함된 단일 열 값을 SQL Server의 여러 열로 분할하려면 어떻게 해야 하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.