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
,这样它就可以形成查询来搜索车辆项目。
您可以使用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 + '%'
)