我有一个asp.net Web应用程序,需要一个搜索页面来搜索特定表(SQL)中的数据。今天它只有一个简单的LIKE查询,使用参数化的sql:
SqlParameter[] param = new SqlParameter[1];
param[0] = new SqlParameter("@searchText", SqlDbType.VarChar);
param[0].Value = "%" + text + "%";
using (SqlDataReader dr = SqlHelper.ExecuteReader(this.ConnectionString, CommandType.StoredProcedure, "isp_Search", param))
{
//Do something
}
现在我需要添加选项以使用逻辑运算符进行搜索。
因此,在文本框中,用户可能会搜索
之类的内容Adam OR Adams
James AND NOT Jame
Douglas AND (Adam OR Adams)
为表格添加全文索引不是首选选项,因为我不控制数据模型。
我正在寻找一种解释文本查询并转换为具有适当数量的SqlParams的SQL语句的方法。
searchexpression = "Douglas AND (Adam OR Adams)"
MakeSearchQuery(searchexpression, out sqlquery, out SqlParam[] params)
会像
那样返回sqlquery = "SELECT someFields FROM table WHERE someField=@Param1 AND (someField=@Param2 OR someField=@Param3)"
和sqlParams一样
sqlParam[0] = 'Douglas'
sqlParam[1] = 'Adam'
sqlParam[2] = 'Adams'
现在必须有人曾经做过这样的事情吗?我搜索了SO和谷歌没有任何真正的成功。关于开源/免费代码的指针或者如何将搜索表达式转换为SQL的好主意是值得欢迎的。
答案 0 :(得分:2)
通过和/或/()等解析查询需要通过某种解析器来完成。对于这个简单的事情,shunting-yard algorithm应该做得很好(以及我们在标签上过滤SE时如何处理和/或/等等,尽管对括号中的子表达式的完整支持是只在内部提供)。这将生成一个操作树,即(这里使用前缀表示,但它通常用于生成AST)
and("Douglas", or("adam", "adams"))
然后您需要使用它来生成TSQL。不是微不足道的,但也不是火箭科学。