2017-06-13 6 views
1

Wie kann ich einen Code hinzufügen, der die folgenden Strings substrings?
Ich brauche die questionID von der variableID, also alles zwischen den beiden Unterstrichen (_). Beispiele:Substring die folgenden Strings

  • hcm_q10_568
  • py_q10x_45
  • sub_q1_34
  • la_q8a_67

Ich habe diesen Code, die für bestimmten Stil-String funktioniert nicht, aber nicht erfüllt alle:

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

Können Sie mir ein paar Ideen geben? Wie funktioniert das für alle Saiten?

+0

Blick auf den optionalen dritten Parameter in CHARINDEX und sehen, ob das nicht, dass Sie eine Idee nicht geben: https://docs.microsoft.com/en-us/sql/t-sql/functions/charindex- transact-sql –

Antwort

4

mit parsename() (wenn es keine Perioden in den Streichern):

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

rextester Demo: http://rextester.com/LWNP30293

kehrt:

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

Für Strings mit Perioden, Sie kann ein temporäres Ersatzzeichen verwenden und es in Agai austauschen n:

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

Referenz:


Wenn Sie wirklich substring() verwenden möchten, und charindex() Sie können gerne so:

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

Ich gebe Ihnen eine UV, wenn Sie eine Nicht-2012-Version geben;) – scsimon

+1

@scsimon 'parsename()' ist nicht 2012+. Das ist nur eine schlechte Dokumentation auf der Microsoft-Website. – SqlZim

+0

Warum glaubst du, dass das vor 2012 nicht funktionieren würde? Ich liebe PARSENAME Hacks! +1 von mir. –

0

Verwenden Sie CHARINDEX. Kurz, aber narrensicher.

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