You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL Server中解析字符串并移除指定前缀内容

问题与解决方案

需求说明

现有SQL Server数据表及数据如下:

CREATE TABLE dbo.promocode 
(
    promo_name varchar(100)
);

INSERT dbo.promocode (promo_name) 
VALUES ('(Web) promo addf 2000 from 4000, 2500 from 5000, 3000 from 6000'),
       ('(CPA Partners) promo abc2a% 200 from 2000, 1000 from 2000'),
       ('(CPA) promo sdafg1300 1300 from 6000');

需要从promo_name字段的字符串中移除三类内容:

  • 开头括号()内的所有内容(括号内允许包含多个单词)
  • 紧随括号后的第一个单词promo
  • promo之后的第二个单词(可包含数字、%等特殊字符)

最终期望输出:

2000 from 4000, 2500 from 5000, 3000 from 6000
200 from 2000, 1000 from 2000 
1300 from 6000

原尝试的SQL语句因未考虑括号内包含空格的场景,导致截取位置错误,无法得到预期结果:

SELECT 
    SUBSTRING(Promo_name, CHARINDEX(' ', Promo_name, 
       CHARINDEX(' ', Promo_name, CHARINDEX(' ', Promo_name) + 1) + 1) + 1, LEN(Promo_name)) AS result
FROM 
    dbo.promocode;

可行解决方案

方案1:SQL Server 2022+ 用正则表达式替换

利用REGEXP_REPLACE直接匹配并移除目标内容,简洁高效:

SELECT 
    TRIM(REGEXP_REPLACE(promo_name, '^\([^)]+\)\s+promo\s+\S+\s+', '')) AS result
FROM dbo.promocode;

正则匹配规则说明:

  • ^\([^)]+\):精准匹配字符串开头的括号及内部所有内容
  • \s+promo\s+:匹配promo单词及其前后的任意数量空格
  • \S+\s+:匹配promo后的第二个非空白单词(含特殊字符)及其后续空格
  • TRIM()用于清理结果首尾可能残留的空格

方案2:兼容低版本SQL Server(2019及以下)

通过PATINDEX和CHARINDEX组合定位截取起点,逐步处理:

SELECT 
    TRIM(SUBSTRING(
        promo_name,
        CHARINDEX(' ', promo_name, CHARINDEX(' ', promo_name, PATINDEX('%)\s+%', promo_name) + 2) + 1) + 1,
        LEN(promo_name)
    )) AS result
FROM dbo.promocode;

步骤解析:

  1. PATINDEX('%)\s+%', promo_name) + 2:定位到括号结束后第一个空格的下一个位置
  2. 连续两次CHARINDEX找到promo和第二个单词之后的空格位置
  3. SUBSTRING截取该位置之后的内容,最后用TRIM整理格式

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 14:43:25