You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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)):从第一个非零字符开始截取,自动去掉开头的连续零,保留中间的零

这两种方案都能得到你想要的输出:AA1234599AX4568704478XB7700812

内容的提问来源于stack exchange,提问作者Eray Balkanli

火山引擎 最新活动