2013-06-27 3 views
2

이것은 매우 쉽지만 T-SQL은 내 목표에서 멀리 떨어져 있습니다. 나는이 밖으로 007941230X을 추출하고 싶습니다t-sql에서 일치하는 패턴 다음에 하위 문자열 찾기

~GS^PO^007941230X^107996118^20130514^ 

:

나는 다음과 같습니다 세그먼트를 포함 정말 긴 문자열의 무리가 있습니다. 이 문자열의 길이는 다양하지만 형식은 항상있을 것입니다 :

~xxxx^.....^xxxxx^~GS^PO^jjjjjjjj^xxx^xxxx^....~ 

사람이 T-SQL에서 J의 값의 문자열을 얻는 방법을 알고 있나요?

나는 patindex를 어떻게 든 사용하려했지만 알아 내지 못했습니다. 문자열은 항상 8 위치에서 시작하고 길이가 다릅니다 경우

+0

HL7입니까? 그리고 'jjjjj'는 항상 문자열의 같은 위치에 있고 다른 값은 고정 길이입니까? –

+0

상수가 될 수있는 것은 값 사이의 구분자 (delimiter)뿐입니다. 불행히도 그 외 모든 것은 고정 길이가 아닙니다. –

+0

주문은 항상 동일합니까? 'GS^PO ^'는 항상 찾고있는 문자열보다 앞에 오는 것이 보장됩니까? –

답변

1

는 작업 예를

declare @var varchar(1000) = '~xxxx^.....^xxxxx^~GS^PO^jjjjjjjj^xxx^xxxx^....' 
declare @start_position int, @end_position int 
declare @temp_string varchar(100) 
select @start_position = PATINDEX('%GS^PO^%', @var) 
print @start_position 
select @temp_string = SUBSTRING(@var, @start_position + 6, 10000) 
print @temp_string 
select @end_position = PATINDEX('%^%', @temp_string) 
print @end_position 
print substring(@temp_string, 1, @end_position -1) 

20 
jjjjjjjj^xxx^xxxx^.... 
9 
jjjjjjjj 
+0

이것은 그랬다! 감사! –

2

, 당신이 할 수 있습니다

with t as (
     select '~GS^PO^007941230X^107996118^20130514^' as val 
    ) 
select substring(val, 8, 
       charindex('^', substring(val, 8, len(val)))-1 
       ) 
from t; 

당신이 8 번째 문자에서 시작 있음을 알 수없는 경우, 당신은 계산하여 그것을 할 수 있습니다 가치. 다음은 하위 쿼리를 사용한 예입니다.

with t as (
     select '~GS^PO^007941230X^107996118^20130514^' as val 
    ) 
select substring(val, start, 
       charindex('^', substring(val, start, len(val)))-1 
       ), start 
from (select charindex('^', t.val, 
         charindex('^', t.val) +1 
        ) + 1 as start, t.* 
     from t 
    ) t 

T-SQL의 문자열 함수는 다른 언어에서만큼 강력하지 않습니다. 그러나 때로는 이와 같은 해결책을 모을 필요가 있습니다. 여기

+0

솔루션을 제공해 주셔서 감사합니다. 두 가지 정답을 선택할 수 있기를 바랍니다. –

관련 문제