2010-07-20 48 views
0

在我的應用程序中,執行花費很長時間的查詢,需要花費幾分鐘才能生成報表。我正在嘗試創建一個將ResultSet轉換爲Excel電子表格的泛型類,其中如果列僅包含空值,則將列從電子表格中排除。我可以很容易地從Excel工作表中刪除列,但是當列數過多時,我已經將它們拆分後很難將工作表「粘合」在一起。確定ResultSet中的列是否包含所有行中的值

我可以做一個查詢來檢查每列是否爲空,但是這可能會導致重複運行代價高昂的查詢,也許多次,這會導致生成電子表格的時間太長。

有沒有一種方法可以查詢我已有的ResultSet對象(有點像ColdFusion)並從中刪除列?

編輯 我最終加入其中,我加入了使用的列的列數的列表<整數>然後通過該集合而不是集ResultSet中的所有列的迭代一個預處理步驟。稍後會發生一些錯誤的錯誤,而且效果很好。

回答

0

在創建工作表之前,您能夠從ResultSet中提取數據並將其存儲在內存中嗎?還是它太大?如果是這樣,那麼當你提取它時,你可以記住每列中是否出現了非空值。一旦完成提取,您就可以確切知道哪些列可以省略。當然,如果數據量如此之大以至於您不想將其存儲在內存中,那麼這種方式並不會奏效。

另一種解決方案是將昂貴查詢的結果存儲在數據庫的「結果」表中。給定查詢執行的每一行都會得到一個來自數據庫序列的「查詢ID」。將數據加載到此表後,後續查詢將檢查「列X中的所有值是否爲空」應該相當快。

注意:如果您打算採用第二種方法,請不要將所有查詢數據提交到應用程序,然後再將其存儲回結果表。重寫原始的「昂貴」查詢來執行插入操作。 「insert into query_result(columns ...)select {costly query}」。

0

我可以做一個查詢,以檢查是否每個 列爲空

更妙的是你可以納入該查詢到查詢,通過計數等,這將是比哩快編寫Java代碼來達到同樣的效果。

相關問題