删除字符串SQL之前和之后的字符

时间:2017-12-14 16:23:11

标签: sql sql-server string replace

我想删除select语句中字符串前后的所有字符。 在下面的示例中,我想删除/Supply>之前和之后的所有内容以及>/之后的内容 请注意,剩下的部分将是固定数量的字符。

非常感谢任何帮助

例如

abs/Supply>hhfhjgglldppprrr>/llllllldsfsjhfhhhfdhudfhfhdhdfhfsd

会变成:

hhfhjgglldppprrr

3 个答案:

答案 0 :(得分:0)

您可以使用PATINDEX()来确定您要查找的模式的位置(/Supply>>/),然后根据字符串的长度删除它们:

SELECT LEFT(RIGHT(col,LEN(col) - PATINDEX('%/Supply>%',col) -7), PATINDEX('%>/%', RIGHT(col,LEN(col) - PATINDEX('%Supply>%',col) -7))-1)

只需使用您的列名替换上面的col

以下示例包含测试字符串 abs/Supply>keep>/remove

首先删除/Supply>之前的所有内容:

SELECT RIGHT('abs/Supply>keep>/remove',LEN('abs/Supply>keep>/remove') - PATINDEX('%/Supply>%','abs/Supply>keep>/remove') -7)

这将给keep>/remove

然后删除>/之后的所有内容:

SELECT LEFT('keep>/remove',PATINDEX('%>/%','keep>/remove') - 1)

这将为keep提供所需字符串的一部分。

以下是组合版本,与上面相同,只包含测试字符串而不是col,因此您可以轻松运行:

SELECT LEFT(RIGHT('abs/Supply>keep>/remove',LEN('abs/Supply>keep>/remove') - PATINDEX('%/Supply>%','abs/Supply>keep>/remove') -7), PATINDEX('%>/%', RIGHT('abs/Supply>keep>/remove',LEN('abs/Supply>keep>/remove') - PATINDEX('%/Supply>%','abs/Supply>keep>/remove') -7))-1)

这将给keep。您也可以将上面的字符串替换为问题中的字符串,我只是使用了不同的测试字符串,因为它更短并且使代码更具可读性。

答案 1 :(得分:0)

如果您的输入始终只有两个">"你可以使用PARSENAME。

declare @SomeValue varchar(100) = 'abs/Supply>hhfhjgglldppprrr>/llllllldsfsjhfhhhfdhudfhfhdhdfhfsd'

select PARSENAME(replace(@SomeValue, '>', '.'), 2)

如果您的数据还包含任何句点(。),则无法正常工作。如果需要,我们可以用几个替换语句来处理。仍然非常简单且易于维护,具有恰好2>的相同警告。

declare @SomeOtherValue varchar(100) = 'abs/Supply>hhfhjgg.lldppprrr>/llllllldsfsjhfhhhfdhudfhfhdhdfhfsd'

select replace(PARSENAME(replace(replace(@SomeOtherValue, '.', '~!@#'), '>', '.'), 2), '~!@#', '.')

答案 2 :(得分:0)

试试这个:

    DECLARE @inputStr  VARCHAR(max)= 'abs/Supply>hhfhjgglldppprrr>/llllllldsfsjhfhhhfdhudfhfhdhdfhfsd'
    DECLARE @startString VARCHAR(100)='/Supply>'
    DECLARE @EndString  VARCHAR(100)='>/'
    DECLARE @LenStartString INT = LEN(@startString)
    DECLARe @TempInputString VARCHAR(max)='';

     DECLARE @StartIndex INT
     DECLARE @EndIndex INT

     SELECT @StartIndex = CHARINDEX(@startString,@inputStr)+@LenStartString
     SELECT @TempInputString = STUFF(@inputStr, 1, @StartIndex, '')
     SELECT SUBSTRING(@TempInputString,0,CHARINDEX(@EndString,@TempInputString))

单行

    DECLARE @inputStr  VARCHAR(max)= 'abs/Supply>hhfhjgglldppprrr>/llllllldsfsjhfhhhfdhudfhfhdhdfhfsd'
    DECLARE @startString VARCHAR(100)='/Supply>'
    DECLARE @EndString  VARCHAR(100)='>/'

    SELECT SUBSTRING(STUFF(@inputStr, 1, CHARINDEX(@startString,@inputStr)+LEN(@startString), ''),0,CHARINDEX(@EndString,STUFF(@inputStr, 1,CHARINDEX(@startString,@inputStr)+LEN(@startString), '')))