1

長い HTML テキストを含む列を持つ SQL Server 2008 テーブルがあります。上部近くには、各レコードに固有の関連する MP3 ファイルへのリンクが提供されています。リンクはすべて次のようにフォーマットされています。

<div class="MediaSaveAs"><a href="filename??.mp3">Download Audio </a></div>

残念ながら、多くのレコードには、このリンクの 2 つまたは 3 つの連続した同一のインスタンスが含まれています。冗長なリンクを見つけて削除するために実行できる比較的単純なスクリプトはありますか?

4

2 に答える 2

0

あなたの説明があまり明確ではなかったため、完全にはわかりませんが、これはあなたが望むことをしているように見えますが、これを「単純なスクリプト」と見なすかどうかはわかりません。

declare @Link nvarchar(200) = N'<div class="MediaSaveAs"><a href="filename123.mp3">Download Audio </a></div>'

declare @BadData nvarchar(max) = N'cbjahcgfhjasgfzhjaucv' + replicate(@Link, 3) + N'cabhjcsghagj',
        @StartPattern nvarchar(34) = N'<div class="MediaSaveAs"><a href="',
        @EndPattern nvarchar(27) = N'">Download Audio </a></div>'

select @BadData

select replace (
    @BadData,
    substring(@BadData, charindex(@StartPattern, @BadData), len(@BadData)-charindex(reverse(@EndPattern), reverse(@BadData))-charindex(@StartPattern, @BadData) + 2),
    substring(@BadData, charindex(@StartPattern, @BadData), charindex(@EndPattern, @BadData) + len(@EndPattern) - charindex(@StartPattern, @BadData))
)

個人的には、このコードを保守する必要はありません。実際に HTML を解析できる別の言語のスクリプトを使用する方がはるかに望ましいでしょう。これは「単なるテキストの問題の繰り返し」だとおっしゃいましたが、それは簡単な問題であるという意味ではなく、特に文字列操作のサポートが非常に限られている TSQL のような言語ではそうではありません。

今後の参考のために、すべての関連情報を質問に入力してください - 必要に応じて編集できます - 読みにくく見落とされる可能性のあるコメントにそれらを残すのではなく. そして、言葉で説明するのではなく、サンプルデータと結果を投稿してください。

于 2013-05-09T21:32:11.580 に答える
0

まず、ファイル名を特定する必要があります。これは、PATINDEX で実行できます。

select 
    substring(html, PATINDEX('%filename%.mp3%', html), PATINDEX('%.mp3%', html)-PATINDEX('%filename%.mp3%', html)+4)
from files

次に、重複を特定して確認します。

delete 
from files 
where id not in (
    select max(id) 
    from files 
    group by substring(html, PATINDEX('%filename%.mp3%', html), PATINDEX('%.mp3%', html)-PATINDEX('%filename%.mp3%', html)+4)
  )

http://www.sqlfiddle.com/#!3/887a3/5

于 2013-05-09T18:56:55.210 に答える