我想删除select语句中字符串前后的所有字符。
在下面的示例中,我想删除/Supply>
之前和之后的所有内容以及>/
之后的内容
请注意,剩下的部分将是固定数量的字符。
非常感谢任何帮助
例如
abs/Supply>hhfhjgglldppprrr>/llllllldsfsjhfhhhfdhudfhfhdhdfhfsd
会变成:
hhfhjgglldppprrr
答案 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), '')))