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
函数逻辑说明
- 先锁定
APP关键字的位置,只处理包含APP的文本 - 跳过APP本身,聚焦到它后面的内容
- 跳过APP后面的非数字符号(比如#、空格),找到第一个数字的起点
- 提取从这个起点开始,到第一个非数字字符为止的片段,就是我们要的目标数字
测试效果
对示例数据执行SELECT dbo.udf_GetAppNumeric(你的列名) FROM 你的表名,就能得到期望的输出:
123423456555
内容的提问来源于stack exchange,提问作者Benjamin P
相关产品推荐
相关产品推荐

