2017-06-13 68 views
1

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

  • hcm_q10_568
  • py_q10x_45
  • sub_q1_34
  • la_q8a_67

我有这样的代码来为特定风格的字符串工作,但不能满足所有:

(substring(@s,charindex('q'',@s),charindex('_',reverse(@s)))) 

你能给我一些想法吗?如何让所有的字符串工作。

+0

看在CHARINDEX可选的第三个参数,看看有没有不给你一个想法:https://docs.microsoft.com/en-us/sql/t-sql/functions/charindex- transact-sql –

回答

4

使用parsename()(如果在弦无期):

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

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

回报:

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

对于周期字符串,可以使用临时替换角色并将其交换出来并返回N:

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 
+0

我给你一个紫外线,如果你给一个非2012版本;) – scsimon

+1

@scsimon'parsename()'不是2012+。这只是微软网站上的糟糕文档。 – SqlZim

+0

为什么你认为这在2012年以前不会奏效?我喜欢PARSENAME黑客!从我+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, @[email protected]) 
end 
print @result