在T-SQL中使用通配符替换

时间:2017-09-07 15:07:35

标签: tsql

我完全知道MS T-SQL不支持正则表达式,但我在项目中需要类似的功能。我没有提取数据的选项,在外部操作它并重新插入表中,所以我试图使用SQL REPLACE语句。

我的问题如下:在我的SQL表中,我有一个文本字段,存储这样的东西:“一些字符^& 20 ^& 20 ^一些字符^& 3 ^& 3 ^一些字符^ & 134 ^& 134 ^一些字符^& 20 ^& 20 ^一些字符^& 134 ^& 134 ^一些字符......“

现在我尝试更换^字符之间的所有数字1 ... 499(例如^& 20 ^& 20 ^和^& 3 ^& 3 ^和^& 134 ^& 134 ^等)具有相同的串^& 500 ^& 500 ^。 如何在SQL中实现这一点。任何帮助表示赞赏。

提前致谢

1 个答案:

答案 0 :(得分:0)

您不清楚要替换文本的内容。此解决方案假设您要替换小于500的数字,如下所示:^& 11 ^与其他内容。我创建了一个变量(@replaceTxt),以便您可以使用结果。我的解决方案使用patternSplitCM

declare @string varchar(8000) =
'blah blah blah... ^&20^&20^ ...my phone number is 555-1234 some characters ^&3000^&3000^ some characters ^&134^&134^ some characters ^&20^&20^... with the same string ^&600^&600^...';
declare @replaceTxt varchar(50) = '555';

select newstring = 
(
select --ps.*,
  case when matched = 1 and 
      (charindex('^', ps.item)*charindex('&', ps.item)*patindex('%[0-9]%', ps.item)) <> 0
    then 
    replace((
      select case when cast(item as int) < 500 then '^&'+@replaceTxt+'^' else '^&'+item+'^' end
      from dbo.PatternSplitCM(ps.item, '[0-9]') 
      where [Matched]=1 for xml path(''), type).value('.', 'varchar(8000)'), '^^', '^')
    else item end +''
from dbo.PatternSplitCM(@string, '[0-9&^]') ps
order by ps.ItemNumber
for xml path(''), type
).value('.', 'varchar(8000)');

结果:

blah blah blah... ^&555^&555^ ...my phone number is 555-1234 some characters ^&3000^&3000^ some characters ^&555^&555^ some characters ^&555^&555^... with the same string ^&600^&600^...

编辑:在示例数据中包含一个电话号码,表示此解决方案并未更改所有号码。