SQL Server 2008中通过正则表达式移除字符串特定字符
解决SQL Server 2008的字符串格式化需求
针对你需要移除字符串开头连续零(非零数字后的零保留)和斜杠的需求,我给你两种可行的方案:
方案一:使用自定义正则函数(匹配你现有使用的dbo.RegexGroup场景)
你已经在使用自定义正则函数,那我们可以通过捕获分组来拼接出目标字符串。正则的思路是:捕获开头的两位字母前缀、去掉前置零后的数字部分、斜杠后的数字部分,然后将这三部分拼接。
正则表达式说明
^([A-Z]{2})0*(\d+)/(\d+)$
^([A-Z]{2}):捕获开头的两位字母前缀0*:匹配前缀后连续的零(我们直接忽略这部分)(\d+):捕获零之后到斜杠前的所有数字(自动跳过开头的零)/:匹配斜杠(直接忽略)(\d+):捕获斜杠后的所有数字
查询语句
如果你的dbo.RegexGroup支持通过分组编号提取内容,就用下面的拼接方式:
SELECT dbo.RegexGroup(t.Value, '^([A-Z]{2})0*(\d+)/(\d+)$', 1) + dbo.RegexGroup(t.Value, '^([A-Z]{2})0*(\d+)/(\d+)$', 2) + dbo.RegexGroup(t.Value, '^([A-Z]{2})0*(\d+)/(\d+)$', 3) AS FormattedValue FROM YourTable t
如果你的自定义函数支持替换模式(比如叫dbo.RegexReplace),可以更简洁:
SELECT dbo.RegexReplace(t.Value, '^([A-Z]{2})0*(\d+)/(\d+)$', '$1$2$3') AS FormattedValue FROM YourTable t
方案二:纯T-SQL方法(无需依赖CLR正则函数)
如果不想依赖自定义CLR函数,我们可以用原生T-SQL的字符串操作来实现,逻辑是:提取前缀、找到前缀后第一个非零数字的位置截取有效数字、提取斜杠后内容,最后拼接。
查询语句
SELECT Prefix + CASE WHEN NonZeroPos > 0 THEN SUBSTRING(PreSlash, NonZeroPos, LEN(PreSlash)) ELSE '' END + PostSlash AS FormattedValue FROM ( SELECT LEFT(Value, 2) AS Prefix, -- 提取前缀后到斜杠前的数字部分 SUBSTRING(Value, 3, CHARINDEX('/', Value) - 3) AS PreSlash, -- 提取斜杠后的所有内容 SUBSTRING(Value, CHARINDEX('/', Value) + 1, LEN(Value)) AS PostSlash, -- 找到第一个非零字符的位置 PATINDEX('%[^0]%', SUBSTRING(Value, 3, CHARINDEX('/', Value) - 3)) AS NonZeroPos FROM YourTable ) t
逻辑说明
LEFT(Value,2):直接取开头两位字母前缀PATINDEX('%[^0]%', PreSlash):定位前缀后数字部分中第一个非零字符的位置SUBSTRING(PreSlash, NonZeroPos, LEN(PreSlash)):从第一个非零字符开始截取,自动去掉开头的连续零,保留中间的零
这两种方案都能得到你想要的输出:AA1234599、AX4568704478、XB7700812。
内容的提问来源于stack exchange,提问作者Eray Balkanli




