2011-05-17 64 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'查詢。可以想象,您可以將其作爲索引視圖或索引計算列來執行此操作。