2013-06-27 163 views
2

這可能很簡單,但T-SQL遠沒有我的優勢。在t-sql中匹配的模式之後找到一個子串字符串

我有一堆包含一個段,看起來像這真的長串的:

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

我想提取007941230X出於此。這個字符串的長度可能會有所不同,但形式永遠是:

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

有誰知道如何得到的值的子字符串在T-SQL J′

我試圖用patindex以某種方式,但無法弄清楚。

+0

HL7? 而且,'jjjjj'總會在字符串中的相同位置,並且其他值是否爲固定長度? –

+0

只有那些不變的值是^值之間的分隔符。不幸的是,其他一切都不是固定的長度。 –

+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

如果字符串總是開始於第8的位置,然後在長度上變化,你可以這樣做:

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

感謝您的解決方案,這也適用。希望我可以選擇兩個正確的答案。 –