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

如何在SQL Server字段字符串中提取所有xx-xxxx格式匹配项

在SQL Server中提取列内所有xx-xxxx格式的匹配项

要从SQL Server表的列中提取所有符合xx-xxxx(两位数字-四位数字)格式的内容,可通过递归CTE实现循环查找,以下是具体方案:

方法1:提取所有匹配项(每行一个匹配结果)

适用于需要将每个匹配项单独成行输出的场景,兼容SQL Server 2005及以上版本:

WITH RecursiveMatch AS (
    -- 初始查询:定位每行第一个匹配项
    SELECT 
        主键列ID,
        -- 前后加空格,确保匹配独立的xx-xxxx,避免被长数字串包含
        ' ' + 目标列名 + ' ' AS 剩余文本,
        -- 截取第一个匹配的xx-xxxx
        SUBSTRING(' ' + 目标列名 + ' ', 
                  PATINDEX('%[^0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][^0-9]%', ' ' + 目标列名 + ' ') + 1, 
                  7) AS 匹配值,
        1 AS 匹配序号
    FROM 你的表名
    -- 筛选存在匹配项的行
    WHERE PATINDEX('%[^0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][^0-9]%', ' ' + 目标列名 + ' ') > 0

    UNION ALL

    -- 递归查询:从剩余文本中继续查找下一个匹配项
    SELECT 
        主键列ID,
        SUBSTRING(剩余文本, 
                  PATINDEX('%[^0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][^0-9]%', 剩余文本) + 8, 
                  LEN(剩余文本)) AS 剩余文本,
        SUBSTRING(剩余文本, 
                  PATINDEX('%[^0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][^0-9]%', 剩余文本) + 1, 
                  7) AS 匹配值,
        匹配序号 + 1 AS 匹配序号
    FROM RecursiveMatch
    -- 当剩余文本中还有匹配项时继续递归
    WHERE PATINDEX('%[^0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][^0-9]%', 剩余文本) > 0
)
-- 输出所有匹配结果
SELECT 主键列ID, 匹配值
FROM RecursiveMatch
ORDER BY 主键列ID, 匹配序号;

方法2:将同一行的匹配项合并为单行

如果需要把同一行的所有匹配项用分隔符(如逗号)合并成一行,可使用STRING_AGG函数(需SQL Server 2017及以上版本):

WITH RecursiveMatch AS (
    SELECT 
        主键列ID,
        ' ' + 目标列名 + ' ' AS 剩余文本,
        SUBSTRING(' ' + 目标列名 + ' ', 
                  PATINDEX('%[^0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][^0-9]%', ' ' + 目标列名 + ' ') + 1, 
                  7) AS 匹配值
    FROM 你的表名
    WHERE PATINDEX('%[^0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][^0-9]%', ' ' + 目标列名 + ' ') > 0

    UNION ALL

    SELECT 
        主键列ID,
        SUBSTRING(剩余文本, 
                  PATINDEX('%[^0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][^0-9]%', 剩余文本) + 8, 
                  LEN(剩余文本)) AS 剩余文本,
        SUBSTRING(剩余文本, 
                  PATINDEX('%[^0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][^0-9]%', 剩余文本) + 1, 
                  7) AS 匹配值
    FROM RecursiveMatch
    WHERE PATINDEX('%[^0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][^0-9]%', 剩余文本) > 0
)
-- 合并同一行的匹配项
SELECT 
    主键列ID,
    STRING_AGG(匹配值, ', ') AS 所有匹配值
FROM RecursiveMatch
GROUP BY 主键列ID
ORDER BY 主键列ID;

说明

  • 代码中的[^0-9]用来确保匹配的xx-xxxx是独立的,不会被更长的数字串(如123-4567)中的子串误匹配。
  • 若不需要严格匹配独立的xx-xxxx,可去掉[^0-9]相关的模式,直接使用%[0-9][0-9]-[0-9][0-9][0-9][0-9]%作为匹配规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:40:08