如何添加以下字符串作为子字符串的代码?
我需要questionID
中的variableID
,即两个下划线(_)之间的任何内容。
示例:
hcm_q10_568
py_q10x_45
sub_q1_34
la_q8a_67
我有这个代码适用于特定样式字符串但不满足所有:
(substring(@s,charindex('q'',@s),charindex('_',reverse(@s))))
你可以给我一些想法吗?如何让这个适用于所有字符串。
答案 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