2010-08-11 3 views
1

I가 하나의 열에서, 예를 들면 가변 길이 구분 된 문자열이 포함 된 테이블 :가변 길이로 구분 된 문자열

20,0, 24,0 ,,^5 0 26,0, 0,^
2810, 0, ..., 34,0, 2, ..., 48,0, 2, ... 44,0, 2, ..., 20,0, 10 ,,^
20,5 ,,^379,1 5 ,,^1 26,1, 32,0 2^,, ,,^71,0 1,2 ,,^

내가해야 할 일은^문자 뒤의 각 숫자가 새로운 행에 반환되도록이 문자열을 분리하는 것입니다. 같은

부품 번호 상품 코드
항목 1 20
항목 2^24
항목 3^24
Item4^27
Item5^28
Item6^65
Item7^66
Item8^39
항목 9^379
항목 10^448
항목 11^427

다양한 분할 함수를 시도해 본 결과 여러 열에 걸쳐 값을 substring'ing하고 unpivot을 사용하여 여러 행에 걸쳐 반환해야하지만이 메서드는 가변 길이를 처리하지 않습니다. 이 문자열의.

더 좋은 방법이 있습니까?

+0

오라클은이 목적을 위해 파이프 라인 기능이 있습니다. SQL Server와 비슷한 기능이있을 수 있습니다. –

+0

파이프 라인 함수는 생성 된 행 수가 입력 변수로 전달되어야합니다. 각 입력 행에 대해 생성 될 행 수를 알지 못합니다. – Matt

답변

0

먼저, 이것이 내가 쉼표로 필드에서 쉼표로 분리 된 이유라고 설명하겠습니다. 그것으로 작업하는 쉽고 효율적인 방법은 없습니다. 말했다

, 당신은 그것에서 숫자를 문자열을 분할 얻기 위해 재귀 쿼리를 사용할 수 있습니다

with split as 
(
    select 
    item = cast('' as varchar(max)), 
    source = cast('20,0, 5,,^24,0, 0,,^26,0, 0,,^281,0, 0,,^34,0, 2,,^48,0, 2,,^44,0, 2,,^20,0, 10,,^20,5, 5,,^379,1, 1,,^26,1, 2,,^32,0, 1,,^71,0, 2,,^' as varchar(max)) 
    union all 
    select 
    item = substring(source, 1, charindex(',,', source)), 
    source = substring(source, charindex(',,', source) + 2, 10000) 
    from split 
    where source > '' 
) 
select substring(item, 1, charindex(',', item) -1) 
from split 
where item > '' 

결과 :

20 
^24 
^26 
^281 
^34 
^48 
^44 
^20 
^20 
^379 
^26 
^32 
^71 
+0

사무실로 돌아가서 테스트 할 기회가 없지만 소스가 데이터베이스의 열인 경우 작동합니다. 예를 들어 5 행에서 source = cast (([dbo]. [Table]의 [Column]을 varchar (max)로 선택) ?? – Matt

+0

@Matt : 그렇습니다. 한 줄로 길면 오래 걸립니다. 그렇지 않으면 테이블 값 함수에 넣고 쿼리에서 함수를 호출해야합니다. – Guffa

관련 문제