【发布时间】:2010-12-10 09:11:03
【问题描述】:
我们有一个应用程序,允许用户输入表达式以对数据库表的字段执行计算。计算允许各种类型的函数(数学、逻辑、字符串、日期等)。例如 MAX(col1, col2, col3)。 请注意,这些表达式可能会因嵌套函数而变得复杂。例如 IF(LENGTH(StringColumn)=0, MAX(col1, col2, 32), MIN(col1, col2, col3)) > LENGTH(col2)
我们实现这一点的一种方法是使用 java cc 解析器来解析用户输入的表达式,然后生成树型数据结构。然后在 java 中解析树,并为表达式中使用的每个函数生成 sql 查询。最后,在为每个用户输入的表达式生成查询之后,java 使用简单的数据库调用来执行这个查询。
这个框架的一个主要问题是数据库问题要在java中处理。数据库问题是指一些数据库限制或任何性能优化。 Microsoft SQL Server 的一个数据库限制是只允许 10 个嵌套的 CASE WHEN 语句。这意味着在解析 java 代码时需要估计查询字符串在翻译之前有多少个 CASE WHEN。 同样,如果要进行任何 sql 性能优化,在 java 中处理它们根本不合逻辑。
有人知道解决这个问题的更好的设计方法吗?
【问题讨论】: