1

我有一个 SQL Server 2008 表,其中有一列包含冗长的 HTML 文本。在靠近顶部的地方,有一个链接提供给每条记录唯一的相关 MP3 文件。链接的格式都如下:

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

不幸的是,许多记录包含此链接的两个或三个连续且相同的实例,而应该只有一个。我可以运行一个相对简单的脚本来查找和消除冗余链接吗?

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 回答