2016-04-22 61 views
1

我正在使用SQL Server Management Studio 2012.我使用醫療記錄並需要取消識別報告。這些報告的結構是一個表格,其中包含Report_Date,Report_Subject,Report_Text等等......我需要更新的字符串在report_text中,並且有大約700,000條記錄。SQL:替換文本字符串中包含的日期

所以,如果我有:

"patient had an EKG on 04/09/2012" 

我需要更換有:

"patient had an EKG on [DEIDENTIFIED]" 

我試圖

UPDATE table 
SET Report_Text = REPLACE(Report_Text, '____/___/____', '[DEIDENTIFED]') 

,因爲我需要在那裏,看起來像要更換什麼一個日期,它運行但實際上並沒有取代任何東西,因爲顯然我不能在這個com中使用_通配符普通話。

對此的任何建議?提前致謝!

回答

0

您可以使用PATINDEX查找日期的位置,然後使用SUBSTRINGREPLACE替換日期。

由於文本中可能有多個日期,因此您必須運行while循環來替換所有日期。

下面的SQL將在

WHILE EXISTS(SELECT 1 FROM dbo.MyTable WHERE PATINDEX('%[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]%',Report_Text) > 0) 

BEGIN 

    UPDATE t 
    SET  Report_Text = REPLACE(Report_Text, DateToBeReplaced, '[DEIDENTIFIED]') 
    FROM (SELECT * , 
         SUBSTRING(Report_Text,PATINDEX('%[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]%',Report_Text), 10) AS DateToBeReplaced 
       FROM  dbo.MyTable AS a 
       WHERE  PATINDEX('%[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]%',Report_Text) > 0 
      ) AS t 

END 

我已經測試過上面的SQL與幾個rows.I一個虛表MM/DD/YYYY的形式,所有日期的工作不知道它是如何將規模爲你的數據,但建議你試試看。

+0

這工作完美,謝謝! – SJBG

0

爲了簡單起見,假定一個數字表示字符串中的標識元素,請查找字符串中第一個數字的位置以及字符串中最後一個數字的位置。不知道這是否適用於您的整套記錄,但這裏是代碼...

我創建了兩個測試字符串...您提供的一個字符串和一個在字符串開頭的日期。

Declare @tstString varchar(100) 
Set @tstString = 'patient had an EKG on 04/09/2012' 
Set @tstString = '04/09/2012 EKG for patient' 

Select @tstString 
-- Calculate 1st Occurrence of a Number 
,PATINDEX('%[0-9]%',@tstString) 
-- Calculate last Occurrence of a Number 
,LEN(@tstString) - PATINDEX('%[0-9]%',REVERSE(@tstString)) 

,CASE 
    -- No numbers in the string, return the string 
    WHEN PATINDEX('%[0-9]%',@tstString) = 0 THEN @tstString 

    -- Number is the first character to find the last position and remove front 
    WHEN PATINDEX('%[0-9]%',@tstString) = 1 THEN 
     CONCAT('[DEIDENTIFIED]',SUBSTRING(@tstString, LEN(@tstString)-PATINDEX('%[0-9]%',REVERSE(@tstString))+2,LEN(@tstString))) 

    -- Just select string up to the first number 
    ELSE CONCAT(SUBSTRING(@tstString,1,PATINDEX('%[0-9]%',@tstString)-1),'[DEIDENTIFIED]') 
    END AS 'newString' 

正如您所看到的,這在SQL中很麻煩。 我寧願使用解析器服務來實現這一點,並使用SSIS移動數據並調用服務。

+0

對不起,不能早點回復你!非常感謝您的幫助。爲了確保這個解決方案能夠在我的表格中工作:本文檔中的文本差異很大;充滿了可能位於文本內任何位置的日期,並且通常沒有任何可預測的情況。這個解決方案會在任何地方找到任何日期並替換它嗎或者我的聲明需要像你的例子一樣具體嗎?再次感謝你。 – SJBG

+0

將一些示例放入@tstString變量中,您將看到結果。它確實會找到日期,但我認爲它會截斷字符串並添加[DEIDENTIFIED]。所以它會找到日期但不顯示整個文本。您將不得不添加另一個WHEN子句來處理日期出現在中間的時間。 –