我有一个[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但没有成功”
一个单元格中可能还有多个主机名实例,所有实例都必须进行转换。
答案 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