sql - 在sql查询中保存记录过滤条件

标签 sql database database-design

我希望能够在数据库中存储记录过滤条件(基本上是 SELECT 查询中 WHERE 之后的内容),我想稍后在 SELECT 中使用该条件。场景是用户(很少)设置过滤条件,并且每次(经常)检索数据记录时都会使用此条件。

过滤条件是一个 bool 表达式,例如:(x AND y) OR z。 x、y 和 z 是可以使用连接表连接到数据记录的关键字。

我可以将表达式存储为 text/xml 然后解析它并在每次我想检索数据时动态构造一个 sql 查询,但这似乎效率低下。

有没有更好的办法?

最佳答案

如果您的列选择是静态的,则可以从该查询创建一个 StoredProcedure 并将 StoredProcedure 名称存储到某个“QueryMaster”表中。这样您就可以将动态查询限制为 Exec SP_EXECUTESQL <SP_NAME> <Params>并为您的主要选择获得编译查询的好处。

您可以 Avoid Conversions In Execution Plans By Using sp_executesql Instead of Exec .

如果您的列选择也不是静态的,您可能希望创建 View 而不是存储过程。仅当您的主表很大或使用大量联接时,这可能会更好。

这是假设您有大量可能的过滤条件和少量的实际过滤条件。例如,用户可以过滤 100 列 - 但他们可能会创建 25-30 种这样的组合并继续使用它。

如果要过滤的列数有限,更好的方法是使用 Case 创建一个通用 where 子句, IsNull , Collace等。参见 Implementing Dynamic WHERE-Clause in Static SQL举几个例子。

关于sql - 在sql查询中保存记录过滤条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6935217/

相关文章:

mysql - 我应该在 Go Web 应用程序中始终打开 1 个全局数据库连接吗?或者我应该每次都打开并关闭它?

php - 你会如何做一个带有修订的评论系统?

php - 关系设计

mysql - MySQl触发器出错,有没有更好的写法?

php - 你能在 SQL 案例中使用 php 吗?

mysql - 检查表的时间重叠?

database-design - 外键中的循环依赖项 : use it or avoid it?

php - 向只有一列的 MySQL 表中插入数据

数据库一对一关系实现

mysql - 创建自定义论坛,帮助构建查询以计算类别中的帖子等