T-SQL从交易文本字段提取数量与单价 已实现数量提取
业务场景
- 基于SQL Server的临时表存储非结构化交易文本,需要从Col字段的自由文本中,精准提取每笔交易对应的交易数量、成交单价两个结构化字段
- 测试用临时表及初始化数据如下:
CREATE TABLE #Items (ID INT , Col VARCHAR(300)) INSERT INTO #Items VALUES (1, 'Dave sold 10 items are sold to ABC servercies at 2.50 each'), (2, '21 was sold to Tray Limited 3.90 each'), (3, 'Consulting ordered 15 at 7.11 per one'), (4, 'Returns from Murphy 7 at a cost of 6.10 for each item')
现有实现的缺陷
目前已编写的数量提取查询采用硬编码截取2位数字长度的逻辑,既无法稳定适配1位长度的交易数量(如ID=4对应的数量7),遇到3位长度的数量时还会出现截取错误,同时完全没有覆盖单价提取的需求:
-- 现有数量提取逻辑 SELECT ID, Col, LEFT(SUBSTRING(Col, PATINDEX('%[0-9]%', Col), LEN(Col)),2) AS Qty FROM #Items
全场景兼容的提取方案
利用两类数字的格式特征实现精准匹配:
- 交易数量:文本中首个独立存在、不带小数点的整数串,长度可能为1位或多位
- 交易单价:文本中符合「整数.小数」格式的浮点数串
完整可运行的查询逻辑:
SELECT ID, Col, -- 提取不带小数点的首段数字作为交易数量,自动适配不同长度 TRY_CAST( SUBSTRING(Col, PATINDEX('%[0-9]%', Col), PATINDEX('%[0-9][^.0-9]%', Col) - PATINDEX('%[0-9]%', Col) + 1 ) AS INT ) AS Qty, -- 提取匹配浮点数格式的串作为交易单价 TRY_CAST( SUBSTRING(Col, PATINDEX('%[0-9].[0-9]%', Col), 5 ) AS DECIMAL(10,2) ) AS Price FROM #Items
查询输出与预期完全匹配:
- ID=1:Qty=10,Price=2.50
- ID=2:Qty=21,Price=3.90
- ID=3:Qty=15,Price=7.11
- ID=4:Qty=7,Price=6.10
内容的提问来源于stack exchange,提问作者JonWay
相关产品推荐
相关产品推荐

