Câu trả lời khác là sử dụng CTE để loại bỏ HTML trước khi thực hiện tìm kiếm.
CTE sau đây trích xuất các hàng có khả năng đáp ứng các tiêu chí tìm kiếm và đệ quy loại bỏ HTML. Truy vấn sau đó sử dụng kết quả của CTE để lọc ra các hàng vẫn chứa HTML và các hàng không khớp chính xác với tiêu chí tìm kiếm.
CTE không phức tạp như mong đợi. Hầu hết các không quan trọng là để đối phó với PATINDEX trở về 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
truy vấn này có giới hạn mà nó không xử lý các tình huống mà> hoặc < là trong văn bản, nhưng điều này có thể được mã hóa xung quanh nếu có yêu cầu.
Liên kết được cung cấp ở trên có các tùy chọn khác nhau và tất cả đều có Mặt cắt/Thu hẹp vì vậy phương pháp tốt nhất và tốt nhất là gì –
@ SOF: Đó là một câu hỏi hợp lý. Tôi e rằng bạn sẽ phải cân nhắc những ưu điểm và nhược điểm trong kịch bản cụ thể của bạn để quyết định liệu việc triển khai này có hợp lý hay không. Tôi tin rằng đó là. Các mệnh đề 'LIKE' rất hạn chế, vì câu hỏi của bạn rất rõ ràng. Chỉ mục toàn văn được triển khai một cách cẩn thận có thể không hoàn hảo, nhưng nó mở rộng ranh giới vượt ra ngoài những gì có thể với các chỉ mục và truy vấn đơn giản hơn. – kbrimington