【问题标题】:SQL search with logical operators使用逻辑运算符的 SQL 搜索
【发布时间】:2012-01-10 10:55:05
【问题描述】:

我有一个 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)

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

我正在寻找一种解释文本查询并将其转换为具有适当数量的 SqlParam 的 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 引擎,答案因数据库而异。有些支持正则表达式,有些不支持。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-10-02
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多