Consulta sobre palabras de una frase

Montando un buscador ha surgido la típica funcionalidad de que si introduces una frase, el cliente quiere que se busque por las palabras sueltas no por la frase. Normalmente lo hago desde PHP/Coldfusion (o lo que sea) creando dinámicamente que query pero buscando soluciones alternativas que pueda ejecutar desde un procedimiento almacenado (sin hacer un exec que queda feo) he encontrado esta posible solución:

declare @terminos varchar(max);
set @terminos = 'zapatos bolsos vestidos bufandas';


declare @cadena table (cadena varchar(500)) 
insert into @cadena values (@terminos)
;WITH Vals AS (
	SELECT  cadena,
		CAST('<d>' + REPLACE(cadena, ' ', '</d><d>') + '</d>' AS XML) XmlColumn
	FROM    @cadena
)

SELECT C.value('.','varchar(max)') palabra
FROM    Vals
CROSS APPLY Vals.XmlColumn.nodes('/d') AS T(C)
where len(C.value('.','varchar(max)')) > 1
-- Este último where es para que solo coja las palabras con longitud superior a un carácter

Y esto lo implementaríamos por ejemplo insertando las palabras sueltas en una tabla que usemos luego para hacer un inner join de la siguiente forma:

declare @palabras table (palabra varchar(500)) 

insert into @palabras
SELECT C.value('.','varchar(max)') palabra
FROM    Vals
CROSS APPLY Vals.XmlColumn.nodes('/d') AS T(C)
where len(C.value('.','varchar(max)')) > 1

-- y la consulta resultante sería asi:
select * from productos p 
inner join @palabras tmp on p.descripcion like '%'+tmp.palabra+'%'

 
Dejar un comentario?

0 Comentarios.

Deje un comentario


NOTA - Puede usar estosHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.