我有一个函数,可以逐字符地搜索另一个表中匹配的ICD-9代码。我这样做是因为我们收到ICD-9代码的格式不一致,并且其中许多格式末尾有额外的数字,或者它们可能在错误的位置有一个小数甚至丢失。
除了寻找部分匹配以至少找到ICD9所属的类别之外,我们别无选择。我们不会将此用于计费目的,因此部分匹配是可以的。幸运的是,ICD9代码按类别进行结构化和编号。因此,假设我们收到的“淋巴肉瘤涉及腹腔内淋巴结”的代码为200.13。我们可能会收到代码为20013,20.013,200.13112等...但我可以逐字符地匹配代码,直到找到最接近的匹配,我提供的所有示例都是200.13。
该函数几乎100%正确运行,它只需要很长时间才能运行,因为必须搜索查找表4或5次以查找最接近的匹配,这使得函数真的很慢。特别是当每条记录必须匹配多达12个代码时,1000条记录。
有关改进查询的任何想法吗?
/* Find match for an ICD9 code in LookupDiseases and selects the desciption . Return the matching
description for the ICD9 code.
*/
ALTER FUNCTION [dbo].[uf_LookupICD9Desc] (@ClaimA99 UNIQUEIDENTIFIER,@ICD9 NVARCHAR(10))
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @Substring NVARCHAR (10)
DECLARE @Description NVARCHAR(MAX)
DECLARE @Length INT
DECLARE @Count INT
/* Remove decimal place from string */
SET @ICD9 = REPLACE(@ICD9,'.','')
/* Get lenth of string */
SET @Length = LEN(@ICD9)
/* Initialize count */
SET @Count = 1
/* Get Substring */
SET @Substring = SUBSTRING(@ICD9,1,@Count)
/* Start processing */
IF (@Length < 1 OR @ICD9 IS NULL)
/* Validate @ICD9 */
BEGIN
SET @Description = 'No match found for ICD-9.'
END
ELSE IF ((SELECT COUNT(*) FROM LookupDiseases WHERE REPLACE(LookupCodeDesc,'.','') LIKE @Substring + '%') < 1)
/* Check for at least one match */
BEGIN
SET @Description = 'No match found for ICD-9.'
END
ELSE
/* Look for matching code */
BEGIN
WHILE ((SELECT COUNT(*) FROM LookupDiseases WHERE REPLACE(LookupCodeDesc,'.','') LIKE @Substring + '%') <> 1 AND (@Count < @Length + 1))
BEGIN
/* Update substring value */
SET @Substring = SUBSTRING(@ICD9,1,@Count + 1)
/* Increment @Count */
SET @Count += 1
/* Select the first matching code and get description */
SELECT TOP(1) @Description = LookupName FROM LookupDiseases WHERE REPLACE(LookupCodeDesc,'.','') LIKE @Substring + '%' ORDER BY LookupCodeDesc ASC
END
END
/* Return the ICD9 code description. */
RETURN(@Description)
END
答案 0 :(得分:2)
有关改进查询的任何想法?
不对
负责我们收到ICD-9代码的格式不一致,其中很多都有额外的数字,或者它们可能在错误的位置有一个小数甚至丢失
不要尝试逐字符地匹配ICD-9代码,而不是小数位,只要有一个匹配就返回匹配,并返回不匹配的代码,需要由一个人解决有商业知识。
如果您需要匹配更高级别的代码,例如,101.0应匹配101.01,101.00,10100.009等,那么您可以为匹配创建查找表,如果它是小规模的,或者,如果不是,将标记存储在另一个字段中,以便您可以按更高级别代码的长度限制搜索。
此外,您需要通过从代码末尾剥离字符进行搜索。例如,如果您输入的代码是200.13112且与您拥有的任何内容不匹配,则接下来搜索200.1311,然后搜索200.131,找到您的匹配项。
我理解代码输入不正确,只是不同意您有责任确定医疗服务提供者应该输入的内容。
答案 1 :(得分:0)
不确定你有多少控制权,但也许你可以另外将它们存储为没有小数点的文本并索引该列,这将允许快速“LIKE”查询。可以想象,您可以将其作为索引视图或索引计算列。