1

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

               列 1 列 2
               项目 1 标签 1
               项目 1 标签 2
               项目 1 标记 3
                 . .
                 . .
                 . .
          
现在用户可以输入任意数量的关键字来搜索表格。如果and使用它,它将进行严格的搜索。如果我使用or它将搜索仅匹配一个关键字的项目。我想要动态塑造自己的查询,并使用搜索中给出的最大关键字(如果不是全部)。就像 aVehicle是项目,它有关键字。Car, Vehicle, conveyance, Cycle, Bike, truck. 现在我想Bike Cycle在文本框中输入关键字,所以它应该形成查询来搜索车辆项目。

4

4 回答 4

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 命令,并添加单个标签作为参数。有关动态查询方法的更多详细信息,请参阅此答案

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

于 2013-05-21T10:07:18.190 回答
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

于 2013-05-21T10:08:00.270 回答
0

你想要这个吗?

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

于 2013-05-21T10:15:54.297 回答
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 + '%'
)
于 2013-05-21T10:16:34.500 回答