SQL:替换文本字符串中包含的日期

时间:2016-04-22 21:42:28

标签: sql sql-server replace

我正在使用SQL Server Management Studio 2012.我使用医疗记录并需要取消识别报告。报告的结构在一个包含Report_Date,Report_Subject,Report_Text等列的表中。我需要更新的字符串在report_text中,并且有大约700,000条记录。

所以,如果我有:

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

我需要将其替换为:

"patient had an EKG on [DEIDENTIFIED]"

我试过

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

因为我需要替换看起来像日期的任何东西,并且它运行但实际上并不替换任何东西,因为显然我不能在此命令中使用_通配符。

对此有何建议?谢谢!

2 个答案:

答案 0 :(得分: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移动数据并调用服务。

答案 1 :(得分:0)

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

由于文本中可能有多个日期,因此您必须运行while循环来替换所有日期。

以下sql将以MM / DD / YYYY

的形式适用于所有日期
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。我不知道它将如何扩展您的数据,但建议您尝试一下。