Sql查询未知数量的关键字

本文关键字:关键字 未知数 查询 Sql | 更新日期: 2023-09-27 18:14:29

我想为未知数量的关键字编写sql查询。关键字(标记)存储在表中,如下所示<>之前column1 column2item1标签1item1标签2item1 tag3. .. .. .之前现在,用户可以输入任意数量的关键字来对表进行搜索。如果使用and,它将进行严格搜索。如果我使用or,它将搜索只匹配一个关键字的项目。我想查询,动态塑造自己,并使用最大的关键字在搜索给出,如果不是全部。像一个Vehicle是项目,它有关键字。Car, Vehicle, conveyance, Cycle, Bike, truck。现在我想在文本框中输入关键字Bike Cycle,这样它就可以形成查询来搜索车辆项目。

Sql查询未知数量的关键字

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

如果标记列表显著增长,使用表值参数的替代方法可以提高查询的性能。

对于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

你想要这个吗?

SELECT * FROM TABLEWHERE x.Keywords in (Select * FROM ListOfWantedKeywords)——想要的关键字列表是你的动态搜索。

你在找这个吗?

和版本:

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