2017-06-13 55 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