Sql查询未知数量的关键字

时间:2013-05-21 09:59:23

标签: c# sql sql-server

我想为未知数量的关键字编写sql Query。关键字(标签)存储在这样的表中          

               column1    column2 
               item1      tag1
               item1      tag2
               item1      tag3
                 .         .
                 .         .
                 .         .
          
现在,用户可以输入任意数量的关键字来搜索表格。如果使用and,它将进行严格搜索。如果我使用or,则会搜索只匹配一个关键字的项目。我想要查询动态塑造自己,并使用搜索中给出的最大关键字,如果不是全部的话。 就像项目Vehicle一样,它有关键字。 Car, Vehicle, conveyance, Cycle, Bike, truck。现在我想在文本框中输入关键字Bike Cycle,因此它应该形成查询以搜索车辆项目。

4 个答案:

答案 0 :(得分:3)

您可以使用OR运算符或等效的IN (...)表达式进行搜索,按项目列对行进行分组,并比较行数。计数最多的行在搜索列表中的关键字数量最多:

SELECT TOP 1
     column1, COUNT(*)
FROM mytable
WHERE column2 IN ('tag1', 'tag3')
GROUP BY column1
ORDER BY COUNT(*) DESC

要处理大量关键字而不将代码暴露给SQL注入,您需要动态生成SQL,或使用表值参数。

如果采用第一种方法,IN表达式将变为IN (@tag0, @tag1, @tag2),最多为搜索字符串中的标记数。创建SQL命令,并将各个标记添加为参数。有关动态查询方法的详细信息,请参阅this answer

如果标记列表显着增长,则使用表值参数的替代方法可以提高查询的性能。 This answer解释了如何做到这一点。

答案 1 :(得分:0)

使用linq就好了(假设你有一个名为Products的模型类)并且用户发送了一组关键字

IQueryable<Product> SearchProducts (params string[] keywords)
{
 IQueryable<Product> query = dataContext.Products;

 foreach (string keyword in keywords)
  {
   string temp = keyword;
   query = query.Where (p => p.Description.Contains (temp));
  }
  return query;
}

有关更精细的方案,请查看

http://www.albahari.com/nutshell/predicatebuilder.aspx

答案 2 :(得分:0)

你想要这个吗?

SELECT * FROM TABLE WHERE.Keywords in(Select * FROM ListOfWantedKeywords) - 想要的关键字列表是您的动态搜索。

答案 3 :(得分:0)

你在找这个吗?

版本:

SELECT
    SRC.*
FROM SRC
WHERE NOT EXISTS (
    SELECT TOP(1)
        1
    FROM (
        VALUES
            ('xxx')
            , ('yyy')
    ) AS KEYWORDS(Word)
    WHERE SRC.col NOT LIKE '%' + Word + '%'
)

或版本:

SELECT
    SRC.*
FROM SRC
WHERE EXISTS (
    SELECT TOP(1)
        1
    FROM (
        VALUES
            ('xxx')
            , ('yyy')
    ) AS KEYWORDS(Word)
    WHERE SRC.col LIKE '%' + Word + '%'
)