2017-05-31 3 views

Antwort

1

Mit einem Cross APPLY. Just for fun, entfernen Sie das letzte WHERE, und sehen, was passiert,

Beispiel

Declare @YourTable table (ID int,SomeText varchar(max)) 
Insert into @YourTable values 
(1, '#want to extract all #hastag out of this string, #delhi #Traffic') 
,(2, '#bunny #hastag #donetodeath') 

Select A.ID 
     ,B.* 
From @YourTable A 
Cross Apply (
       Select RetSeq = Row_Number() over (Order By (Select null)) 
         ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
       From (Select x = Cast('<x>' + replace((Select replace(replace(A.SomeText,char(13),' '),' ','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
       Cross Apply x.nodes('x') AS B(i) 
      ) B 
Where B.RetVal like '#%' 

Returns

ID RetSeq RetVal 
1 1  #want 
1 5  #hastag 
1 10  #delhi 
1 11  #Traffic 
2 1  #bunny 
2 2  #hastag 
2 3  #donetodeath 
+0

Thank you! Das war sehr hilfreich, aber ich habe festgestellt, dass es keine Hashtags aufnimmt, wenn der String neue Zeilen enthält. Wenn zum Beispiel nach der neuen Zeile in einer Zeichenfolge Hashtags vorhanden sind, werden diese nicht zurückgegeben, und da ich mit der Methode der Zeichenfolgenmanipulation in SQL nicht vertraut bin, weiß ich nicht, wie das zu erreichen ist – teku45

+0

@ teku45 Werfen Sie einen Blick auf die UDF hier https://stackoverflow.com/questions/42958278/sql-server-search-using-like-while-ignoring-blank-spaces/42958939#42958939 oder Sie können einfach hinzufügen ... replace (A.SomeText, char (13), '') –

+0

@ teku45 aktualisiert die Antwort mit dem einfachen ersetzen –

Verwandte Themen