SQL带有逻辑运算符的搜索

9

我有一个asp.net网络应用程序,需要一个搜索页面来在特定表格(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'

现在一定有人做过类似的事情吧?我已经在Stack Overflow和Google上搜索了很久,但没有取得真正的成功。欢迎提供开源/免费代码或者关于如何将搜索表达式转换为SQL的好主意。


你使用哪个 SQL 引擎取决于具体的数据库,有些支持正则表达式,而有些则不支持。 - Johan
1个回答

2

需要通过某种解析器来解析查询,包括and/or/()等。对于这种简单的情况,可以使用逆波兰算法(在过滤标签时处理and/or/not等时我们也是用这种方法,尽管只有内部才支持带括号的子表达式)。这将生成一棵操作树,即(这里使用前缀表示法,但它更通常用于产生AST)。

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

然后,你需要使用它来生成T-SQL。这并不简单,但也不是什么高深的科学。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接