另一個答案是在執行搜索之前使用CTE去除HTML。
下面的CTE提取可能滿足搜索條件的行並遞歸地去掉HTML。查詢然後使用CTE的結果過濾掉仍包含HTML的行和不完全匹配搜索條件的行。
CTE並不像看起來那麼複雜。大多數小提琴演奏的是應對PATINDEX返回0
--** Test table
DECLARE @HTML TABLE (id INT IDENTITY, html VARCHAR(max))
INSERT INTO @HTML SELECT 'This is a <span style="font-weight: bold; ">nice</span> question';
INSERT INTO @HTML SELECT 'The cat sat <span style="font-weight: bold; ">on the</span> mat';
--** Search criteria
DECLARE @Search VARCHAR(50) = 'is a nice';
--** CTE to return the matching rows ignoring the HTML
;WITH Search_CTE (html_id, html_text)
AS (
SELECT h.id AS 'html_id'
, LEFT(h.html,REPLACE(PATINDEX('%<%',h.html)-1,-1,999999)) + SUBSTRING(h.html,CONVERT(INT,REPLACE(PATINDEX('%>%',h.html)+1,1,999999)),LEN(h.html)) AS 'html_text'
FROM @HTML AS h
WHERE h.html LIKE '%' + REPLACE(@Search,' ','%') + '%'
UNION ALL
SELECT c.html_id AS 'html_id'
, LEFT(c.html_text,REPLACE(PATINDEX('%<%',c.html_text)-1,-1,999999)) + SUBSTRING(c.html_text,CONVERT(INT,REPLACE(PATINDEX('%>%',c.html_text)+1,1,999999)),LEN(c.html_text)) AS 'html_text'
FROM Search_CTE AS c
WHERE PATINDEX('%<%',c.html_text) > 0
)
SELECT h.html AS 'Original HTML'
, cte.html_text AS 'HTML Text'
FROM Search_CTE AS cte
JOIN @HTML AS h
ON h.id = cte.html_id
WHERE PATINDEX('%<%',cte.html_text) = 0 --** Filter out rows still containing HTML
AND html_text LIKE '%' + @Search + '%'; --** Filter out rows not matching the search criteria
此查詢有侷限性,它不處理的情況下>或<是在文本,但如果需要,這可以圍繞編碼。
以上給出的鏈接有不同的選項,並且所有的都有顛倒/下跌 那麼什麼是最好的最終和最好的方法 – 2010-08-16 05:12:40
@SOF:這是一個公平的問題。恐怕您必須權衡您的特定情況下的優缺點,以決定此實施是否合理。我相信是的。 「LIKE」條款非常有限,因爲您的問題如此雄辯。仔細實施的全文索引可能並不完美,但它擴展了超越簡單索引和查詢所能實現的範圍。 – kbrimington 2010-08-16 05:33:18