REGEX替换在T-SQL中

时间:2014-02-14 18:54:40

标签: sql sql-server regex sql-server-2000

我的文章表格中有错误的描述。例如Ger-teschutz,因为有人用ä替换了所有-

现在我希望得到Geräteschutz而不是Ger-teschutz,但我还有其他字符串必须保持这种状态,例如TX-40WA-I30

但我只想在该字符串中替换那个-而不是全部。

我想用正则表达式替换它们,其中-之前的字符是大写字母,后面是小写字母。

有人能帮助我吗?

2 个答案:

答案 0 :(得分:1)

  

我想用正则表达式替换它们,其中 - 之前的字符是大写字母,后面是小写字母。

我不确定您描述的这个正则表达式是否会以您在示例中的方式捕获所有数据,但这是SQL中的一种可能性:

update MyTable
set MyColumn = left(MyColumn, patindex('%[A-Z]-[a-z]%', MyColumn collate Latin1_General_BIN))
                + 'ä'
                + right(MyColumn, len(MyColumn) - 1 - patindex('%[A-Z]-[a-z]%', MyColumn collate Latin1_General_BIN))
where MyColumn collate Latin1_General_BIN like '%[A-Z]-[a-z]%'

GeR-teschutz - > GeRäteschutz

请注意,likepatindex都可以理解字符集,就像正则表达式一样。我还特别使用区分大小写的二进制文件collation,因为我不知道你的数据库。

如果一个值中有多个匹配项(“GeR-tescH-tz”),您还必须多次运行。

这不会检查数据中可能存在的边界情况(单词结尾等)。

更新:我已更新查询以使用更常见的字符集范围,并使用二进制排序规则。如果需要非二进制排序规则,则必须将每个字母放入集合中。来源:How does SQL Server Wildcard Character Range, eg [A-D], work with Case-sensitive Collation?

答案 1 :(得分:0)

所以你想要的是什么,与问题中的值有些矛盾。您希望 -之前的字母为UPPER而之后的字母更低。那个正则表达式看起来像这样:

([A-Z]-[a-z])

Regular expression visualization

Debuggex Demo

但是,您会在演示中注意到与这两个值的 second 匹配:

Ger-teschutz
GeR-teschutz

无论哪种方式,如果您想要的内容

现在,在SQL 2000中使用该正则表达式是一个小技巧。此时你会希望你在MySQL。但是这篇文章很好地解释了如何实现正则表达式的用法:TSQL Replace all non a-z/A-Z characters with an empty string

注意:在该帖子中,回答者利用了存储过程。如果需要,您也可以利用函数,因为它们可以内联到查询中。