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

本文关键字:SQL 搜索 逻辑运算符 | 更新日期: 2023-09-27 18:16:13

我有一个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和Google,但没有任何真正的成功。欢迎提供开源/免费代码或如何将搜索表达式转换为SQL的好主意。

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

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

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

,然后您需要使用它来生成TSQL。