改进搜索表匹配字符串的SQL函数

时间:2011-05-17 14:55:52

标签: sql sql-server

我有一个函数,可以逐字符地搜索另一个表中匹配的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

2 个答案:

答案 0 :(得分:2)

有关改进查询的任何想法?

不对

负责

我们收到ICD-9代码的格式不一致,其中很多都有额外的数字,或者它们可能在错误的位置有一个小数甚至丢失

不要尝试逐字符地匹配ICD-9代码,而不是小数位,只要有一个匹配就返回匹配,并返回不匹配的代码,需要由一个人解决有商业知识。

如果您需要匹配更高级别的代码,例如,101.0应匹配101.01,101.00,10100.009等,那么您可以为匹配创建查找表,如果它是小规模的,或者,如果不是,将标记存储在另一个字段中,以便您可以按更高级别代码的长度限制搜索。


此外,您需要通过从代码末尾剥离字符进行搜索。例如,如果您输入的代码是200.13112且与您拥有的任何内容不匹配,则接下来搜索200.1311,然后搜索200.131,找到您的匹配项。

我理解代码输入不正确,只是不同意您有责任确定医疗服务提供者应该输入的内容。

答案 1 :(得分:0)

不确定你有多少控制权,但也许你可以另外将它们存储为没有小数点的文本并索引该列,这将允许快速“LIKE”查询。可以想象,您可以将其作为索引视图或索引计算列。