> 데이터 베이스 > MySQL 튜토리얼 > 여러 데이터 세그먼트가 포함된 단일 열 값을 데이터베이스의 별도 열로 효율적으로 분할하려면 어떻게 해야 합니까?

여러 데이터 세그먼트가 포함된 단일 열 값을 데이터베이스의 별도 열로 효율적으로 분할하려면 어떻게 해야 합니까?

Patricia Arquette
풀어 주다: 2024-12-17 10:41:24
원래의
498명이 탐색했습니다.

How can I efficiently split a single column value containing multiple data segments into separate columns in a database?

단일 열 값을 여러 열로 분할

데이터베이스에서 일반적인 작업은 여러 조각이 포함된 단일 열 값을 분할하는 것입니다. 정보를 별도의 열로 분리합니다. 이 문서에서는 이러한 데이터 변환을 달성하기 위한 인라인 접근 방식을 제시합니다.

문제 설명

구독 번호가 단일 값으로 저장되는 구독 테이블이 있습니다. 한 열에. 구독 번호는 대시와 공백으로 구분된 여러 세그먼트로 구성됩니다. 목표는 이 값을 접두사, 세그먼트 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿