Otra respuesta es usar un CTE para quitar el HTML antes de hacer una búsqueda.
El siguiente CTE extrae las posibles filas que satisfacen los criterios de búsqueda y separa recursivamente el código HTML. Luego, la Consulta utiliza los resultados del CTE para filtrar las filas que todavía contienen HTML y las que no coinciden exactamente con los criterios de búsqueda.
El CTE no es tan complicado como parece. La mayor parte del trasteo es para hacer frente a PATINDEX devolver 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
Esta consulta tiene la limitación de que no se ocupa de la situación en la que> o < está en el texto, pero esto puede ser codificado en torno a si es necesario.
El enlace de arriba tiene diferentes opciones y todas tienen ventajas/inconvenientes así que cuál es el mejor método final y mejor –
@SOF: Esa es una buena pregunta. Me temo que tendrá que sopesar las ventajas y desventajas en su escenario específico para decidir si esta implementación es razonable. Yo creo que es. Las cláusulas 'LIKE' son extremadamente limitadas, como su pregunta lo demuestra de manera elocuente. Un índice de texto completo cuidadosamente implementado puede no ser perfecto, pero extiende los límites más allá de lo que es posible con índices y consultas más simples. – kbrimington