子串--T-SQL

时间:2013-02-14 15:12:30

标签: sql sql-server sql-server-2008 tsql

我有一个字符串可以插入到表中。字符串的大小和内容各不相同。

我基本上想要两个已知单词(_ Part1ID =_ Part2ID =)之间的所有字符。

我希望从整个字符串中获取这两个字符串之间的所有内容。

我已尝试this approach,但在_ Part2ID =之前获取所有内容。

任何人都知道如何在特定条件下完成这项工作?

谢谢

5 个答案:

答案 0 :(得分:3)

declare @someString nvarchar(200) = 'lkasjdlkasjdl_Part1ID=hereIsTheBitYouWant_Part2IDlksajdlaksdj'

select  substring(@someString, patindex('%_Part1ID%', @someString) + 9, patindex('%_Part2ID%', @someString) - (patindex('%_Part1ID%', @someString) + 9))

答案 1 :(得分: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)

答案 2 :(得分: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 :(得分: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)
   )

答案 4 :(得分: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