我正在使用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]')
因为我需要替换看起来像日期的任何东西,并且它运行但实际上并不替换任何东西,因为显然我不能在此命令中使用_通配符。
对此有何建议?谢谢!
答案 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
查找日期的位置,然后使用SUBSTRING
和REPLACE
替换日期。
由于文本中可能有多个日期,因此您必须运行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。我不知道它将如何扩展您的数据,但建议您尝试一下。