子串以下字符串

时间:2017-06-13 18:04:26

标签: sql sql-server

如何添加以下字符串作为子字符串的代码?
我需要questionID中的variableID,即两个下划线(_)之间的任何内容。 示例:

  • hcm_q10_568
  • py_q10x_45
  • sub_q1_34
  • la_q8a_67

我有这个代码适用于特定样式字符串但不满足所有:

(substring(@s,charindex('q'',@s),charindex('_',reverse(@s))))
你可以给我一些想法吗?如何让这个适用于所有字符串。

2 个答案:

答案 0 :(得分:4)

使用parsename()(如果字符串中没有句点):

select 
    middle = parsename(replace(str,'_','.'),2)
from t

rextester演示:http://rextester.com/LWNP30293

返回:

+--------+
| middle |
+--------+
| q10    |
| q10x   |
| q1     |
| q8a    |
+--------+

对于具有句点的字符串,您可以使用临时替换字符并将其交换出来并重新输入:

select 
    middle = replace(parsename(replace(replace(str,'.',char(29)),'_','.'),2),char(29),'.')
from t

参考:

如果你真的想使用substring()charindex(),你可以这样:

select 
     middle=substring(str
      ,(charindex('_',str)+1)
      ,(charindex('_',str,(charindex('_',str)+1))-charindex('_',str)-1)
    )
from t

答案 1 :(得分:0)

使用CHARINDEX。 Terse,但万无一失。

declare @input varchar(50)
declare @index1 int, @index2 int
declare @result varchar(50)
select @input = 'my_string_here';
select @index1=CHARINDEX('_', @input, 1)
if (@index1 > 0)
begin
   select @index2 = CHARINDEX('_', @input, @index1+1)
   if (@index2 > 0)
        select @result = SUBSTRING(@input, @index1+1, @index2-@index1-1)
end
print @result