2013-02-14 22 views
1

我有得到就會插入到表中的字符串。字符串的大小和內容各不相同。子串 - T-SQL

我基本上要兩個已知詞(_ Part1ID =_ Part2ID =)之間的所有字符。

我想從整個字符串這兩個字符串之間得到的一切。

我已經試過this approach_ Part2ID =之前得到的一切。

任何人知道如何使這項工作在給定的條件?

謝謝

+2

目前還不清楚你問什麼。你能提供一些例子嗎? – RBarryYoung 2013-02-14 15:20:19

+3

在添加示例的同時,Part1和/或Part2在輸入中顯示*多倍*次?如果是這樣,那應該如何處理? – 2013-02-14 15:27:43

+0

謝謝各位回覆。馬克的答案似乎適用於我的情況。我將很快發佈一個例子,看看是否有更好的技術來做到這一點。謝謝。 :) – 007 2013-02-14 15:54:54

回答

2

嘗試:

with a as 
(select 'abc_ Part1ID =efg_ Part2ID =jkl' a) 
select a, 
     substring(a, 
       charindex('_ Part1ID =',a)+len('_ Part1ID ='), 
       charindex('_ Part2ID =',a)-charindex('_ Part1ID =',a)-len('_ Part1ID =')) 
from a 
3
declare @someString nvarchar(200) = 'lkasjdlkasjdl_Part1ID=hereIsTheBitYouWant_Part2IDlksajdlaksdj' 

select substring(@someString, patindex('%_Part1ID%', @someString) + 9, patindex('%_Part2ID%', @someString) - (patindex('%_Part1ID%', @someString) + 9)) 
2
DECLARE @s varchar(1000) 
SET @s = 'this is a test _ Part1ID = of the emergency broadcast _ Part2ID = system' 
SELECT SUBSTRING(@s, PATINDEX('%_ Part1ID =%',@s)+11, 
      PATINDEX('%_ Part2ID =%',@s)-PATINDEX('%_ Part1ID =%',@s)-11) 
+0

包括一些解釋可以幫助OP瞭解您發佈的代碼的實質。 – 2013-02-14 15:39:16

+1

這樣做,就像所有其他答案一樣...... – 2013-02-14 17:05:14

1

修改此模板與您的關鍵字和字段名。

declare @mystring nvarchar(max) = 'some irrelevant text STARTPOINTI Should Return this text to youENDPOINT other irrelevant text'; 
declare @bookend1 nvarchar(max) = 'STARTPOINT'; 
declare @bookend2 nvarchar(max) = 'ENDPOINT'; 
select 
    substring 
    (
    @mystring 
    ,CHARINDEX(@bookend1,@mystring) + len(@bookend1) 
    ,charindex(@bookend2,@mystring) - charindex(@bookend1,@mystring) - len(@bookend1) 
    ) 
1

說字符串(或字符串列)被命名爲s,嘗試:

substring(s, nullif(charindex('_ Part1ID = ', s),0) + 12 -- skip tag (length = 12) 
      , nullif(charindex('_ Part2ID = ', s),0) 
      - (nullif(charindex('_ Part1ID = ', s),0) + 12)) 

這假定Part2ID標籤永遠不會Part1ID之前出現。我們做nullif(charindex(...),0),這樣如果我們沒有找到標籤的話,結果會是正確的。

如果您要創建一個內聯函數,你可能會有點更優雅:

CREATE FUNCTION dbo.fnGetPart ( 
    @s varchar(8000), @tag1 varchar(20), @tag2 varchar(20) 
) returns varchar(100) AS 
BEGIN 
    return ( select substring(@s, i1, i2 - i1) 
     from ( select i1, i2 = nullif(charindex(@tag2, @s, i1),0) -- ', i1' ensures we look after @tag1 
      from (select i1 = nullif(charindex(@tag1, @s),0) + len(@tag1)) t) t) 
END