2016-04-22 110 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子句来处理日期出现在中间的时间。 –