使用逻辑运算符进行SQL搜索

时间:2011-12-01 09:18:17

标签: c# sql sql-server sql-server-2008 search

我有一个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的好主意是值得欢迎的。

1 个答案:

答案 0 :(得分:2)

通过和/或/()等解析查询需要通过某种解析器来完成。对于这个简单的事情,shunting-yard algorithm应该做得很好(以及我们在标签上过滤SE时如何处理和/或/等等,尽管对括号中的子表达式的完整支持是只在内部提供)。这将生成一个操作树,即(这里使用前缀表示,但它通常用于生成AST)

and("Douglas", or("adam", "adams"))

然后您需要使用它来生成TSQL。不是微不足道的,但也不是火箭科学。