2016-04-22 6 views
1

私はSQL Server Management Studio 2012を使用しています。私は医療記録を扱い、レポートの識別を解除する必要があります。レポートは、Report_Date、Report_Subject、Report_Textなどの列を持つテーブルに構造化されています。更新する必要のある文字列はreport_textにあり、〜700,000個のレコードがあります。SQL:テキスト文字列に含まれる日付の置換

私が持っているのであれば:私はのように見えること、そこに何かを交換する必要があるので、私は

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

を試してみました

"patient had an EKG on [DEIDENTIFIED]" 

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

私はそれを交換する必要があります実際には何も置き換えられません。なぜなら、私はこのcomで_ワイルドカードを使用できないようですマンド

これに関するお勧めは?アドバンスありがとう!

答えて

0

PATINDEXを使用してDateの場所を探し、SUBSTRINGREPLACEを使用して日付を置き換えることができます。

テキストに複数の日付がある場合は、すべての日付を置き換えるためにwhileループを実行する必要があります。

SQLは、それが拡大されますかわからない、私はいくつかのrows.Iダミーテーブルの上に上記の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 

MM/DD/YYYYの形式ですべての日付のために働く下記あなたのデータのためにそれを試してみることをお勧めします。

+0

これは完璧に働いた、ありがとう! – SJBG

0

数字を文字列の中の特定の要素を表すと仮定して、文字列の最初の数字の位置と最後の文字列の位置を探します。これがあなたのレコード全体に当てはまるのかどうかは分かりませんが、コードはここにあります。

2つのテスト文字列を作成しました。あなたが入力した文字列と文字列の先頭に日付文字列があります。

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句を追加する必要があります。 –

関連する問題