집 >데이터 베이스 >MySQL 튜토리얼 >여러 데이터 세그먼트가 포함된 단일 열 값을 데이터베이스의 별도 열로 효율적으로 분할하려면 어떻게 해야 합니까?
단일 열 값을 여러 열로 분할
데이터베이스에서 일반적인 작업은 여러 조각이 포함된 단일 열 값을 분할하는 것입니다. 정보를 별도의 열로 분리합니다. 이 문서에서는 이러한 데이터 변환을 달성하기 위한 인라인 접근 방식을 제시합니다.
문제 설명
구독 번호가 단일 값으로 저장되는 구독 테이블이 있습니다. 한 열에. 구독 번호는 대시와 공백으로 구분된 여러 세그먼트로 구성됩니다. 목표는 이 값을 접두사, 세그먼트 1, 세그먼트 2 등과 같은 개별 열로 분할하는 것입니다.
예
다음 샘플 구독을 고려하세요. 숫자:
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 (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
결과
쿼리의 출력은 다음과 같습니다. 다음은 다음과 같습니다.
+---------+---------+---------+---------+---------+---------+---------+ | 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 | +---------+---------+---------+---------+---------+---------+---------+
설명
쿼리는 교차 적용을 사용하여 구독 번호의 각 세그먼트에 대한 행 집합을 생성합니다. xml 경로 표현식 '/x[1]'은 첫 번째 세그먼트를 추출하고, '/x[2]'는 두 번째 세그먼트를 추출하는 방식입니다. ltrim 및 rtrim 기능은 선행 또는 후행 공백을 정리하는 데 사용됩니다.
대체 접근 방식
또한 분할을 저장하기 위해 즉시 새 테이블을 생성할 수도 있습니다. 값:
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
결론
제공되는 인라인 접근 방식은 단일 열 값에서 여러 세그먼트를 추출하기 위한 다목적 솔루션입니다. 특정 데이터 요구 사항에 맞게 쉽게 조정할 수 있습니다.
위 내용은 여러 데이터 세그먼트가 포함된 단일 열 값을 데이터베이스의 별도 열로 효율적으로 분할하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!