2010-08-18 4 views
3

J'ai actuellement une requête SQL qui renvoie des résultats basés sur un nombre dynamique de mots-clés transmis.Requête SQL Search utilisant des mots-clés

Je convertis la liste de mots-clés dans une table et y adhère.

SELECT * FROM Table1 
    INNER JOIN 
     dbo.udf_List2Table(@Keywords, ',') ON (Field1 LIKE '%'+Keyword+'%') 

Cela fonctionne bien, mais il renvoie toutes les lignes qui contiennent l'un des mots-clés qui sont suppiled. Ce que je voudrais faire est de retourner toutes les lignes qui contiennent tous les des mots-clés fournis.

Je suis sûr que vous ne pouvez pas faire cela en utilisant un JOIN. Est-ce que quelqu'un a des suggestions sur la façon dont je pourrais faire cela? J'essaie d'éviter le SQL dynamique.

Merci

Répondre

1
SELECT * 
FROM Table1 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM dbo.udf_List2Table(@Keywords, ',') 
     WHERE field1 NOT LIKE '%' + Keyword + '%' 
     ) 

Cela peut se faire de manière plus efficace si vous créez un index FULLTEXT sur field1 et faites votre @Keywords doublequote clos et AND séparés:

SET @Keywords = '"cabbages" AND "kings"' 
SELECT * 
FROM table1 
WHERE CONTAINS(Field1, @Keywords) 
+0

Ceci est sujette à l'injection sql, si vous recherchez le mot clé '''); DROP TABLE table1; - ' –

+1

@Jon, je pense que c'est simplement un exemple utilisant une variable et une chaîne de caractères pour illustrer la syntaxe. Dans le monde réel, je soupçonne que @Keywords serait un paramètre dans une procédure stockée qui ne serait pas vulnérable à l'injection SQL. –

+0

@Jon: non, ce n'est pas le cas, tant que vous passez le mot-clé dans un paramètre lié. – Quassnoi

1

Essayez

SELECT Field1 FROM Table1 
INNER JOIN 
    dbo.udf_List2Table(@Keywords, ',') ON (Field1 LIKE '%'+Keyword+'%') 
GROUP BY Field1 
HAVING COUNT(Keyword) = n 

pour correspondre des mots-clés n

0

Peut être que vous pouvez faire après tweak.

DECLARE @recordcount int 
SELECT @recordcount = count(1) from dbo.udf_List2Table(@Keywords, ',') 
select t1.Field1 
from Table1 t1 
where @recordcount = (select count(1) from dbo.udf_List2Table(@Keywords, ',') k where t1.Field1 like '%' + k.Keyword + '%')