2010-07-20 36 views
0

在我的应用程序中,执行花费很长时间的查询,需要花费几分钟才能生成报表。我正在尝试创建一个将ResultSet转换为Excel电子表格的泛型类,其中如果列仅包含空值,则将列从电子表格中排除。我可以很容易地从Excel工作表中删除列,但是当列数过多时,我已经将它们拆分后很难将工作表“粘合”在一起。确定ResultSet中的列是否包含所有行中的值

我可以做一个查询来检查每列是否为空,但是这可能会导致重复运行代价高昂的查询,也许多次,这会导致生成电子表格的时间太长。

有没有一种方法可以查询我已有的ResultSet对象(有点像ColdFusion)并从中删除列?

编辑 我最终加入其中,我加入了使用的列的列数的列表<整数>然后通过该集合而不是集ResultSet中的所有列的迭代一个预处理步骤。稍后会发生一些错误的错误,而且效果很好。

回答

0

在创建工作表之前,您能够从ResultSet中提取数据并将其存储在内存中吗?还是它太大?如果是这样,那么当你提取它时,你可以记住每列中是否出现了非空值。一旦完成提取,您就可以确切知道哪些列可以省略。当然,如果数据量如此之大以至于您不想将其存储在内存中,那么这种方式并不会奏效。

另一种解决方案是将昂贵查询的结果存储在数据库的“结果”表中。给定查询执行的每一行都会得到一个来自数据库序列的“查询ID”。将数据加载到此表后,后续查询将检查“列X中的所有值是否为空”应该相当快。

注意:如果您打算采用第二种方法,请不要将所有查询数据提交到应用程序,然后再将其存储回结果表。重写原始的“昂贵”查询来执行插入操作。 “insert into query_result(columns ...)select {costly query}”。

0

我可以做一个查询,以检查是否每个 列为空

更妙的是你可以纳入该查询到查询,通过计数等,这将是比哩快编写Java代码来达到同样的效果。

相关问题