【问题标题】:T-SQL regular expression replaceT-SQL 正则表达式替换
【发布时间】:2014-01-07 13:18:52
【问题描述】:

我需要替换 SQL Server 中的字符串。我知道t-sql并不完全支持这个正则表达式替换功能,但是我们可以使用PATINDEX等函数来做到这一点。

基本上,我需要的是替换以 wwwwww[0-9] 开头的 URL 字符串,例如:

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

我试过了:PATINDEX('(www[0-9]?)\.%',@url),但它不符合我的需要。有谁知道如何在没有函数 CLR 的情况下简单地做到这一点?

【问题讨论】:

    标签: sql sql-server regex tsql


    【解决方案1】:

    你可以

    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
    

    对于

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

    【讨论】:

      【解决方案2】:

      您可以使用Stuff()CharIndex() 函数:

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

      Fiddle demo 1

      根据 cmets,您可以使用 CASE 表达式进行另一次检查:

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

      Fiddle demo 2

      或者如果您需要检查 www 的前 3 个字符;

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

      Fiddle demo 3

      【讨论】:

      • 不,这不是我真正需要的,因为不是所有的 url 都以 www 开头,如果 url 像 abc.com,我需要保持原样。
      • 您可以轻松地使用Case expression 来做到这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2011-03-16
      • 1970-01-01
      • 2019-01-24
      • 2015-01-24
      • 1970-01-01
      相关资源
      最近更新 更多