2013-09-26 63 views
0

我有一個查詢從數據庫返回數據。在單個字段中,對段的文本評論相當長,使用標記標籤(如!markerstart!!markerend!)可以明確定義該段。我希望有一個查詢返回兩個標記之間的字符串段刪除(和標記刪除)。SQL從查詢結果中刪除子串

我通常會在獲取數據後執行此客戶端,但問題是查詢是從語句獲取數據的INSERT查詢。我不希望將文本段存儲在歸檔/報告表中(在此使用OLTP應用程序),所以我需要找到一種方法使SELECT語句準確返回要插入的內容,其中這種情況下,意味着獲取SELECT聲明去除不需要的短語,而不是在後處理客戶端中執行它。

我唯一的想法就是用的SUBSTRINGCHARINDEXCONCAT一些令人費解的組合,但我希望有一個更好的辦法,但是,基於this,我怎麼沒看到。任何人有想法?

樣品:

這是文本的長字符串在某些領域是有需要刪除的片段的數據庫。 !markerstart!這是要刪除的細分。它的長度是未知的和可變的。 !markerend!在該標記之後出現的該字段的部分應該保留。

結果:

這是文本的長字符串在某些領域是有需要刪除的片段的數據庫。在該標記之後出現的該字段的部分應該保留。

解決方案使用STUFF:

我真的不喜歡的詳細程度,這是的,但我可以把它放在一個函數,如果我真的需要。這並不理想,但比CLR例程更容易,更快捷。

SELECT STUFF(CAST(Description AS varchar(MAX)), CHARINDEX('!markerstart!', Description), CHARINDEX('!markerend!', Description) + 11 - CHARINDEX('!markerstart!', Description), '') AS Description 
FROM MyTable 
+0

爲什麼不'刪除()''都!markerstart!'和'!markerend!'? – Kaf

+0

我想刪除兩個標記之間長度不同的標記和文本。 – cjbarth

+0

如果您可以顯示示例文本和預期結果,會更好。 – Kaf

回答

0

您可以使用Stuff函數或替換函數並用''替換不需要的符號。 ('EXP',START_POS,'NUMBER_OF_CHARS','REPLACE_EXP')

+0

這很好,但它仍然意味着我必須以某種方式找到開始位置和長度。 – cjbarth

+0

不,您可以使用charindex和左或右等函數來找出位置。 –