我有一个功能,在一个字符的另一个表中查找匹配的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
有谁知道为什么SQL代码在发布时无法正确显示?我正在从SSMS粘贴它。 – Matt 2011-05-17 14:57:33
我想你应该在所有代码行中加上4个空格。 – xs0 2011-05-17 14:58:17
你的问题是什么?另外,我没有看到如何删除ICD9代码的小数位数,它们对于确定数值非常重要。你能提供你的输入和输出的例子吗? – Beth 2011-05-17 15:00:56