确定ResultSet中的列是否包含所有行中的值

时间:2010-07-20 16:19:21

标签: java jdbc

在我的应用程序中,我执行了一个代价高昂的查询,需要几分钟才能生成报告。我正在尝试创建一个将ResultSet转换为Excel电子表格的泛型类,如果列只包含空值,则从电子表格中排除该列。事后我可以轻松地从Excel工作表中删除列,但是当我在已经拆分它们时,很难将工作表重新粘合在一起。

我可以进行查询以检查每列是否为空,但这需要重新运行昂贵的查询,可能需要多次,这会使电子表格的生成时间过长。

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

修改 我最后添加了一个预处理步骤,其中我将使用过的列的列号添加到List< Integer>然后遍历该集合而不是ResultSet中所有列的集合。稍后会出现一些错误,并且效果很好。

2 个答案:

答案 0 :(得分:0)

您可以从ResultSet中提取数据并在创建工作表之前先将其存储在内存中,还是太大?如果是这样,那么在您提取它时,您可以记住是否在每列中都看到了非空值。完成提取后,您确切地知道可以省略哪些列。当然,如果数据量太大而您不希望将其存储在内存中,则这种方法效果不佳。

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

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

答案 1 :(得分:0)

  

我可以查询是否每个   列为空

更好的是,您可以通过COUNT等将该检查合并到原始查询中。这比编写Java代码的速度要快一些。