2011-05-17 57 views
1

我有一个功能,在一个字符的另一个表中查找匹配的ICD-9代码。我这样做是因为我们接收ICD-9代码的格式不一致,其中许多数字在最后有额外的数字,或者他们可能在错误的地方有一个小数,甚至丢失。改进SQL函数搜索表匹配字符串

除了寻找部分匹配以至少找到ICD9所属的类别之外,我们没有别的选择。我们不使用这个作为计费目的,因此部分匹配是可以的。幸运的是,ICD9代码按结构分类编号。因此,我们可以说我们收到了“淋巴肉瘤涉及腹内淋巴结的代码”,代码是200.13。我们可能收到代码为20013,20.013,200.13112等,但我可以按字符匹配代码字符,直到找到最接近的匹配项,对于我提供的所有示例,这些匹配项都是200.13。

该函数几乎100%正确工作,只需要很长时间才能运行,因为必须搜索查找表4次或5次以查找最接近的匹配项,这会使函数非常慢。尤其是当它必须匹配1000条记录的每条记录最多12个代码时。

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

/* 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

有谁知道为什么SQL代码在发布时无法正确显示?我正在从SSMS粘贴它。 – Matt 2011-05-17 14:57:33

+0

我想你应该在所有代码行中加上4个空格。 – xs0 2011-05-17 14:58:17

+0

你的问题是什么?另外,我没有看到如何删除ICD9代码的小数位数,它们对于确定数值非常重要。你能提供你的输入和输出的例子吗? – Beth 2011-05-17 15:00:56

回答

2

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

不要将

我们收到ICD-9代码中并不一致,其中许多人对年底额外的数字或他们可能有一个小数点放错了地方或者格式责任甚至失踪

不要试图与独立于小数位的字符匹配ICD-9代码,只是在有一个返回匹配并返回不匹配的代码时需要由具有商业知识的人员解决。

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


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

我知道代码输入错误,只是不同意确定医疗服务提供者'应该'输入的内容。

+0

我同意我们不应该试图弥补保险公司的错误,但由于我们业务的性质,我们必须检查保险索赔以找到索赔所针对的ICD-9类别。我们正在进行相当大规模的工作,有将近700万的索赔,所以匹配的任何改进都会有所帮助。 – Matt 2011-05-17 15:24:39

+0

如果这是一个糟糕的条目,您需要拒绝它,但是您需要区分可以快速搜索的完全匹配和更高级别的匹配,这需要更长的时间才能找到(您可以删除一个字符在一段时间之外的代码长度不匹配,直到你找到一个。)在我看来,小数不应该被忽略或替换。 – Beth 2011-05-17 15:29:30

+0

我们正在合作的保险公司相当大,但即使他们也无法解决ICD9编码不正确的问题,因为代码是在发生索赔的医院/医生办公室输入的。所以我们坚持我们收到的格式与数据一样糟糕。 – Matt 2011-05-17 15:30:56

0

不知道你有多少控制,但也许你可以额外存储它们作为文本没有小数点和索引该列,这将允许快速'LIKE'查询。可以想象,您可以将其作为索引视图或索引计算列来执行此操作。