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:
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