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

Paa*_*and 9 c# sql sql-server search sql-server-2008

我有一个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
}
Run Code Online (Sandbox Code Playgroud)

现在我需要添加选项以使用逻辑运算符进行搜索.

因此,在文本框中,用户可能会搜索类似的内容

Adam OR Adams
James AND NOT Jame
Douglas AND (Adam OR Adams)
Run Code Online (Sandbox Code Playgroud)

向表中添加全文索引不是首选选项,因为我不控制数据模型.

我正在寻找一种解释文本查询并转换为具有适当数量的SqlParams的SQL语句的方法.

searchexpression = "Douglas AND (Adam OR Adams)"
MakeSearchQuery(searchexpression, out sqlquery, out SqlParam[] params)
Run Code Online (Sandbox Code Playgroud)

会有类似的回报

sqlquery = "SELECT someFields FROM table WHERE someField=@Param1 AND (someField=@Param2 OR someField=@Param3)"
Run Code Online (Sandbox Code Playgroud)

和sqlParams一样

sqlParam[0] = 'Douglas'
sqlParam[1] = 'Adam'
sqlParam[2] = 'Adams'
Run Code Online (Sandbox Code Playgroud)

现在必须有人曾经做过这样的事情吗?我搜索SO和谷歌没有任何真正的成功.并且指向开源/免费代码的指针或关于如何将搜索表达式转换为SQL的好主意是受欢迎的.

Mar*_*ell 2

通过 and/or/() 等对查询的解析需要通过某种解析器来完成。对于这么简单的事情,调车场算法应该做得很好(这就是我们在过滤标签上的 SE 时处理 and/or/not 等的方式,尽管对括号子表达式的完全支持仅在内部可用)。这将生成一个操作树,即(这里使用前缀表示,但它更通常用于生成 AST)

and("Douglas", or("adam", "adams"))
Run Code Online (Sandbox Code Playgroud)

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