Sous-string des strings suivantes

Comment puis-je append un code qui sous-string les strings ci-dessous?
J'ai besoin du questionID de la variableID , c'est-à-dire, n'importe quoi entre les deux traits de soulignement (_). Exemples:

  • hcm_q10_568
  • py_q10x_45
  • sub_q1_34
  • la_q8a_67

J'ai ce code qui fonctionne pour une string de style spécifique mais ne satisfait pas tous:

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

Pourriez-vous me donner quelques idées? Comment faire fonctionner cela pour toutes les strings.

en utilisant parsename() (s'il n'y a pas de points dans les strings):

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

rextester demo: http://rextester.com/LWNP30293

résultats:

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

Pour les strings avec des points, vous pouvez utiliser un caractère de rlocation temporaire et l'échanger à nouveau:

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

Référence:

  • Utilisation de la fonction PARSENAME pour séparer des données délimitées – Damian Maclennen – 2003-11-10

Si vous voulez vraiment utiliser subssortingng() et charindex() vous pouvez aimer:

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

Utilisez CHARINDEX. Tranchant, mais infaillible.

 declare @input varchar(50) declare @index1 int, @index2 int declare @result varchar(50) select @input = 'my_ssortingng_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