如何在其他模式后面替换SQL Server中的字符串实例?

时间:2016-03-30 15:31:40

标签: sql sql-server regex sql-server-2005 replace

我有一个[message]列,可以包含主机名信息 - 我需要替换和删除部分信息。

我写这样做的声明是:

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

因此,显示为RL12345.COMPANY.COM的主机名将返回为NN12345。

问题是,如果“RL”出现在消息列的任何其他位置,则会被错误地替换。有没有办法使用正则表达式有条件地替换? 我可以验证RL和.COMPANY.COM之间的数字字符数总是在7-9之间。

为了澄清,虽然RL将始终是主机名字符串的开头,但它可能不会(也可能不会)成为消息列中整个字符串的开头。

e.g:

“试图访问RL12345.COMPANY.COM但没有成功”

一个单元格中可能还有多个主机名实例,所有实例都必须进行转换。

2 个答案:

答案 0 :(得分:0)

查找字符串'- RL'可能就足够了:

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

第二种方法是简单地查找第一次出现并替换它。不幸的是,replace()没有选项只能替换第一个,但你可以用其他功能来破解它。像这样:

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%';

答案 1 :(得分:0)

这似乎有效,但您必须多次运行更新,因为它只更新' RL'一次

 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