2016-03-30 4 views
0

Ich habe eine [Nachricht] Spalte, die Hostname Informationen enthalten kann - die ich ersetzen muss und Teile davon entfernen.Wie ersetzt man die Instanz der Zeichenfolge in SQL Server, wenn ein anderes Muster folgt?

Die Aussage, die ich schrieb, dies zu tun war:

update table1 
set  message = replace(replace(message ,'RL','NN'),'.COMPANY.COM','') 
where message is not NULL 

So ein Hostname, der als RL12345.COMPANY.COM als NN12345 zurückkehren erscheint.

Das Problem ist, dass wenn "RL" irgendwo anders in der Nachrichtenspalte erscheint, wird es fälschlicherweise ersetzt. Gibt es eine Möglichkeit, mit einer Regex bedingt zu ersetzen? Ich konnte überprüfen, dass die Anzahl der numerischen Zeichen zwischen RL und .COMPANY.COM zum Beispiel immer zwischen 7-9 lag.

Zur Klarstellung, obwohl RL immer der Anfang der Hostnamen-Zeichenfolge ist, kann es nicht (und wird wahrscheinlich nicht) der Anfang der gesamten Zeichenfolge in der Nachrichtenspalte sein.

z.B .:

„Versuchte RL12345.COMPANY.COM zugreifen ohne Erfolg“

Es gibt auch mehrere Host-Namen-Instanzen in der eine Zelle sein kann, müssen alle Instanzen tansformed werden.

+0

sollte immer auftreten RL vor dem ersten ' .' Charakter? –

+0

Ja, RL wird immer die ersten beiden Buchstaben des Hostnamens sein und daher immer dem ersten vorangehen. Charakter – alexmc

+0

Sorry, um zu klären - es wird dem ersten vorausgehen. Zeichen im Hostnamen, aber nicht unbedingt in der gesamten Zeichenfolge. – alexmc

Antwort

0

für die Zeichenfolge der Suche '- RL' ausreichend sein:

update table1 
    set message = replace(replace(message, '- RL', '- NN'), '.COMPANY.COM', '') 
    where message like '%- RL[0-9]%.COMPANY.COM%'; 

Ein zweiter Ansatz für das erste Auftreten sehen einfach ist und dass ersetzen. Leider gibt es keine Option für replace(), nur die erste zu ersetzen, aber Sie können es mit anderen Funktionen hacken. Etwas wie folgt aus:

update table1 
    set message = left(message, charindex('- RL', message)) + '- NN') + 
       substring(message, charindex('- RL', message) + 4, 
          charindex('.COMPANY.COM', message) - charindex('- RL', message) - 4 
         ) + 
       right(message, len(message) - charindex('.COMPANY.COM') - 12) 
    where message like '%- RL[0-9]%.COMPANY.COM%'; 
+0

Der Hostname wird normalerweise nicht mit "-" vorangestellt, es sei denn, ich habe Ihre Syntax missverstanden. Es kann auch mehrere Instanzen eines Host-Namens innerhalb einer Zelle geben. – alexmc

+0

@alexmc. . . Die ursprüngliche Version der Frage schien einen Bindestrich vor dem "RL" zu haben. –

0

dies scheint zu stehen, aber Sie werden das Update mehrere Mal ausgeführt haben, wie es nur ‚RL‘ aktualisiert zu einem Zeitpunkt

update table1 
set message = case when isnumeric(substring(message ,charindex('RL',message)+2,7)) = 1 then left(message ,charindex('RL',message)-1) + 'MN' + substring(id,charindex('RL',message)+2,1000) else message end 
Verwandte Themen