2013-05-09 44 views
1

我有一個包含冗長HTML文本的列的SQL Server 2008表。在頂部附近提供了用於每個記錄獨有的關聯MP3文件的鏈接。這些鏈接都格式如下:SQL Server:刪除字符串內的重複文本

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

不幸的是多條記錄包含該鏈接的兩個或三個連續的和相同的情況下,人們應該只有一個。是否有一個相對簡單的腳本可以運行以查找並消除冗餘鏈接?

+0

目前尚不完全清楚您的數據是什麼樣的或您需要什麼結果,但是您必須在TSQL中執行此操作嗎?對於使用文本來說,這是一種非常糟糕的語言,因此使用其他語言的腳本要容易得多。你可以編寫一個CLR程序,但是像Python或Perl這樣的語言可能更簡單,它具有用於解析HTML的庫。 – Pondlife 2013-05-09 18:57:33

+0

謝謝 - 我幾乎限於我可以作爲SQL Mgmt Studio中的腳本運行;這幾乎只是一個重複的文本問題,它是HTML的事實可能並不重要。 – user2367358 2013-05-09 19:36:42

+0

您仍然需要顯示一些示例數據:從您的問題中不清楚整個'div'類是否在列中重複出現,或者只有錨元素,或者只有文件名或其他。您還沒有說*爲什麼*您只能使用TSQL(或者您可以使用CLR過程);有了這些信息,人們可能會有一個完全不同的,更簡單的解 – Pondlife 2013-05-09 19:42:05

回答

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這樣的語言中,對字符串操作的支持有限。

爲了將來的參考,請將所有相關信息放入問題中 - 如果需要,可以編輯它 - 而不是將它們留在難以閱讀並可能被忽略的註釋中。請發佈樣本數據和結果,而不是用文字描述。

+0

感謝您的支持,我認爲這會奏效。 – user2367358 2013-05-09 23:30:13

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