SQL Server如何提取患者主诉字段内指定关键词后的首个数值
SQL Server自定义函数实现关键词后首个数值提取
实现逻辑
通过字符定位、截取、规则匹配三步完成数值提取,兼容整数、带小数点的浮点数,关键词匹配失败或无对应数值时返回NULL。
完整函数代码
CREATE FUNCTION dbo.patientstringfunction ( @inputString NVARCHAR(MAX), -- 存储患者主诉的文本字段 @keyWord NVARCHAR(200) -- 要匹配的指定关键词 ) RETURNS DECIMAL(18,2) AS BEGIN DECLARE @keyPos INT, @afterKey NVARCHAR(MAX), @numStart INT, @numEnd INT, @result DECIMAL(18,2) -- 查找关键词位置,不存在直接返回NULL SET @keyPos = CHARINDEX(@keyWord, @inputString) IF @keyPos = 0 RETURN NULL -- 截取关键词之后的所有内容 SET @afterKey = SUBSTRING(@inputString, @keyPos + LEN(@keyWord), LEN(@inputString)) -- 定位首个数字/小数点的起始位置 SET @numStart = PATINDEX('%[0-9.]%', @afterKey) IF @numStart = 0 RETURN NULL -- 定位数字结束位置(第一个非数字/小数点的位置) SET @numEnd = PATINDEX('%[^0-9.]%', SUBSTRING(@afterKey, @numStart, LEN(@afterKey))) IF @numEnd = 0 SET @numEnd = LEN(@afterKey) + 1 -- 转换为数值,格式异常时返回NULL BEGIN TRY SET @result = CAST(SUBSTRING(@afterKey, @numStart, @numEnd - 1) AS DECIMAL(18,2)) END TRY BEGIN CATCH SET @result = NULL END CATCH RETURN @result END GO
使用示例
针对样例文本患者头痛,体重:156kg,身高:170cm,调用方法如下:
-- 提取体重数值 SELECT dbo.patientstringfunction(patient, '体重:') FROM patient -- 返回结果:156.00 -- 提取身高数值 SELECT dbo.patientstringfunction(patient, '身高:') FROM patient -- 返回结果:170.00
注意事项
- 关键词需与文本中的表述完全一致,比如文本中用中文冒号
:,传入的关键词不能用英文冒号:,否则会匹配失败 - 支持整数、带小数点的浮点数提取,若数值存在多个小数点等非法格式,会返回NULL
- 若需要返回整数结果,可将函数返回值类型改为INT,同步修改CAST转换的目标类型即可
内容的提问来源于stack exchange,提问作者mehmetsucu
相关产品推荐
相关产品推荐

