집 >데이터 베이스 >MySQL 튜토리얼 >여러 값이 포함된 단일 열 값을 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&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 중국어 웹사이트의 기타 관련 기사를 참조하세요!