我想为未知数量的关键字编写sql Query。关键字(标签)存储在这样的表中
column1 column2 item1 tag1 item1 tag2 item1 tag3 . . . . . .现在,用户可以输入任意数量的关键字来搜索表格。如果使用
and
,它将进行严格搜索。如果我使用or
,则会搜索只匹配一个关键字的项目。我想要查询动态塑造自己,并使用搜索中给出的最大关键字,如果不是全部的话。
就像项目Vehicle
一样,它有关键字。 Car, Vehicle, conveyance, Cycle, Bike, truck
。现在我想在文本框中输入关键字Bike Cycle
,因此它应该形成查询以搜索车辆项目。
答案 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;
}
有关更精细的方案,请查看
答案 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 + '%'
)