2014-01-07 18 views
6

Ich muss eine Ersetzung der Zeichenfolge in SQL Server. Ich weiß, dass t-sql diese Regex-Ersetzungsfunktion nicht vollständig unterstützt, aber wir können Funktionen wie PATINDEX verwenden, um das zu tun.T-SQL regulären Ausdruck ersetzen

Im Grunde, was ich brauche, ist eine Reihe von URL zu ersetzen mit www oder www [0-9], zum Beispiel starten:

  • www.123456.com => 123456.com
  • www2.123456.com => 123456.com

ich versuchte: PATINDEX('(www[0-9]?)\.%',@url), aber es stimmt nicht, was ich brauche. Kann jemand das einfach ohne eine CLR-Funktion machen?

Antwort

8

Sie können

with t(f) as (
    select 'www.foo.com' union 
    select 'www9.bar.com' union 
    select 'wwwz.quz.com' union 
    select 'mail.xxx.com' 
) 
select 
    case when patindex('www.%', f) + patindex('www[0-9].%', f) = 0 then f else substring(f, 1 + charindex('.', f), len(f)) end 
from t 

Für

(No column name) 
mail.xxx.com 
foo.com 
bar.com 
wwwz.quz.com 
+0

Danke, das funktioniert. :) –

2

können Sie Stuff() und CharIndex() Funktionen nutzen:

Select stuff(url ,1, charindex('.', url), '') newUrl 
From t 

Fiddle demo 1

Per Kommentare, man konnte mit einem CASE Ausdruck erneut die Kontrolle tun:

select case when charindex('.', url, charindex('.', url)+ 1) > 0 
      then stuff(url ,1,charindex('.', url),'') 
      else url 
     end newUrl 
from t 

Fiddle demo 2

Oder wenn Sie nach den ersten 3 Zeichen für www suchen müssen;

select case when left(url,3) = 'www' 
      then stuff(url ,1,charindex('.', url),'') 
      else url 
     end newUrl 
from t 

Fiddle demo 3

+0

Nein, das ist nicht das, was ich wirklich brauche, weil nicht alle die URL mit beginnt ** www **, wenn URL wie ** abc.com ** ist, muss ich so bleiben wie es ist. –

+0

Sie können dazu einfach einen 'Case-Ausdruck' verwenden. – Kaf

Verwandte Themen