在sql查询中搜索字符串的开头并返回整个字符串

时间:2014-06-06 10:25:34

标签: sql sql-server

我正在尝试在SQL中搜索一个字符串,搜索前面几个我知道将是唯一的字符,然后将字符串返回到它之后的第一个空格。

然而,它没有回归我的期望。以下是我的发言:

declare @searchString varchar(max),
        @searchForStartChars varchar(max)

set @searchString = 'My ST_Test001 testing blah'
set @searchForStartChars = 'ST_Test'

select SUBSTRING(@searchString,
        charindex(@searchForStartChars,@searchString,1),
            charindex(' ',@searchString,
                charindex(@searchForStartChars,@searchString,1)))

我想让它返回ST_Test001

由于

2 个答案:

答案 0 :(得分:1)

你没有从substring的长度中减去第一场比赛的起点:

declare @searchString varchar(max),
        @searchForStartChars varchar(max)

set @searchString = 'My ST_Test001 testing blah'
set @searchForStartChars = 'ST_Test'

select SUBSTRING( @searchString
                , charindex( @searchForStartChars, @searchString, 1 )
                , charindex( ' '
                           , @searchString
                           , charindex( @searchForStartChars, @searchString, 1 )
                           )
                   - charindex( @searchForStartChars, @searchString, 1 )
                )

我在substring的最后一个参数中的当前代码之后添加了这个:

- charindex( @searchForStartChars, @searchString, 1 )

答案 1 :(得分:1)

这是另一个解决方案(因为我已经把时间放进去了,哈哈):

DECLARE @searchString VARCHAR(MAX),
        @searchForStartChars VARCHAR(MAX),
        @searchStringStartPos INTEGER;

SET @searchString = 'My ST_Test001 testing blah';
SET @searchForStartChars = 'ST_Test';
SET @searchStringStartPos = CHARINDEX(@searchForStartChars, @searchString, 1) 

SELECT      CASE
                WHEN @searchStringStartPos = 0 THEN ''
                ELSE    CASE
                            WHEN CHARINDEX(' ', SUBSTRING(@searchString, @searchStringStartPos, LEN(@searchString)), 1) = 0 THEN SUBSTRING(@searchString, @searchStringStartPos, LEN(@searchString))
                            ELSE SUBSTRING(@searchString, @searchStringStartPos, CHARINDEX(' ', SUBSTRING(@searchString, @searchStringStartPos, LEN(@searchString)), 1) - 1)
                        END
            END AS EntireSearchString;