使用关键词的SQL搜索查询

3

我目前有一个SQL查询,根据传入的动态关键字返回结果。

我将关键字列表转换为表并进行连接。

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

这个功能目前可以正常工作,但它返回包含任何关键字的所有行。我想要的是返回包含所有关键字的所有行。
我相信你不能使用JOIN实现这一点。有人有什么建议吗?我正在尝试避免使用动态SQL。
谢谢。
3个回答

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

如果您在field1上创建一个FULLTEXT索引,并将您的@Keywords用双引号括起来并用AND分隔,那么可以更有效地完成此操作:

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

如果您搜索关键字 ''); DROP TABLE table1;--,则容易受到 SQL 注入攻击。 - Jon Freedman
1
@Jon,我认为这只是一个使用变量和字符串字面量来说明语法的示例。在现实世界中,我怀疑@Keywords将成为存储过程中的参数,不会容易受到SQL注入攻击。 - Ben Robinson
@Jon:不,只要您将关键字传递给绑定参数,这就不是问题。 - Quassnoi
NOT EXISTS语句返回了完美的结果,谢谢。我同意FULLTEXT索引会更好,但目前我没有创建它的权限。@Jon,你的答案也很好用。不过我选择了这种方法,还是谢谢你。 - Jamie

1

尝试

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

匹配 n 个关键字


0

也许你可以尝试以下调整。

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 + '%')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接