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

SQL Server:提取APP关键字后至下一个空格前的数值的问题

精准提取APP关键字后的目标数字

问题背景

用户表中有一列文本数据,需要提取APP关键字之后、下一个空格之前的数字,但现有的dbo.udf_GetNumeric函数会错误提取无关数字(比如B2B里的2),急需修正方案。

数据示例

Data Service B2B APP#1234 Rehearsal 03/01/2025
Office 365 APP 23456 for project 123
Office 365 APP555 for project 123

期望输出

  • 第一行:1234
  • 第二行:23456
  • 第三行:555

现有函数问题

当前的dbo.udf_GetNumeric函数逻辑是移除所有非数字字符,会把文本里所有数字都捞出来(比如B2B的2、Office 365的365、项目编号123等),完全没法定位到APP之后的目标数字段。

修正方案

换个思路:先定位APP的位置,再精准提取它后面的数字段。以下是重写后的函数:

CREATE FUNCTION dbo.udf_GetAppNumeric
    (@strInput VARCHAR(256))
RETURNS VARCHAR(256)
AS
BEGIN
    -- 找APP关键字的位置,没有的话直接返回空
    DECLARE @appStart INT = CHARINDEX('APP', @strInput)
    IF @appStart = 0
        RETURN ''

    -- 截取APP之后的所有内容
    DECLARE @afterApp VARCHAR(256) = SUBSTRING(@strInput, @appStart + 3, LEN(@strInput))
    
    -- 找APP之后第一个数字的位置,没数字返回空
    DECLARE @numStart INT = PATINDEX('%[0-9]%', @afterApp)
    IF @numStart = 0
        RETURN ''

    -- 从第一个数字开始,找第一个非数字的位置
    DECLARE @numEnd INT = PATINDEX('%[^0-9]%', SUBSTRING(@afterApp, @numStart, LEN(@afterApp)))
    -- 如果后面全是数字,直接取剩下的;否则取到非数字前的部分
    RETURN CASE 
        WHEN @numEnd = 0 THEN SUBSTRING(@afterApp, @numStart, LEN(@afterApp))
        ELSE SUBSTRING(@afterApp, @numStart, @numEnd - 1)
    END
END

函数逻辑说明

  1. 先锁定APP关键字的位置,只处理包含APP的文本
  2. 跳过APP本身,聚焦到它后面的内容
  3. 跳过APP后面的非数字符号(比如#、空格),找到第一个数字的起点
  4. 提取从这个起点开始,到第一个非数字字符为止的片段,就是我们要的目标数字

测试效果

对示例数据执行SELECT dbo.udf_GetAppNumeric(你的列名) FROM 你的表名,就能得到期望的输出:

  • 1234
  • 23456
  • 555

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:50:10