2016-06-09 43 views
0

我有一個SQL查詢,我想知道該SQL查詢返回多少行。現在的問題是我想知道事前結果的數量,這意味着在運行SQL查詢之前。Java正則表達式:要知道一個SQL查詢返回的行數

我會通過ResultSet.getRow()輕鬆完成此操作,以獲取結果集中的總行數。但是根據要求,只有在知道該查詢返回的行數後,我才能得到結果集。

我嘗試了下面的Java正則表達式來解決這一問題:

String orgQuery = "select * from emp where id<1210 and salary>55000;" 
Pattern p= Pattern.compile("(?:)from\\s+(.*)*" , Pattern.CASE_INSENSITIVE); 
Matcher m= p.matcher(orgQuery); 
    if (m.find()) { 
        countQuery = "SELECT COUNT(*) as total "+ m.group(1); 
        System.out.println(countQuery); 
        } 

這項工作完全文件,我得到了「countQuery」爲:

SELECT COUNT(*) as total from emp where id<1210 and salary>55000 

通過這個我可以很容易地知道電話號碼的行要事先返回,但問題發生在我的查詢變得像這兩個更復雜時: - 在嵌套查詢(即#query2)的情況下更爲複雜。

#query1: select * from emp where id<1210 and salary>55000 order by dept, salary desc; 

#query2: select name from emp where id IN (select id from emp where id < 1210 group by salary , id order by id ASC limit 10) order by id DESC limit 10 

我認爲主要問題是「Order By」子句。我太受刪除「排序」條款如下正則表達式:

Pattern.compile("(?:)from\\s+(.*)*" , Pattern.CASE_INSENSITIVE); 

但它成爲嵌套查詢的情況更加複雜。

任何Java Regex專家都可以幫忙嗎?我使用postgres作爲數據庫。

+0

我想你會更好使用SQL解析器。嘗試谷歌搜索一個或看到這個問題http://stackoverflow.com/questions/660609/sql-parser-library-for-java –

+0

我不知道它是否會幫助我。在我的情況下,「Select coun(*)」查詢是在原始查詢的基礎上在運行時生成的。 –

回答

2

總結現有查詢,像這樣:

select count(*) from (<existing query>) 

有了您給出的例子:

String orgQuery = "select * from emp where id<1210 and salary>55000"; 
String countQuery = "select count (*) from (" + orgQuery + ')'; 

我知道這工作與Oracle。我沒有使用postgres,所以我不確定是否會有什麼阻止這種方法在那裏工作。

但是,我會提醒您先計算一次計數,但是您可能會在執行計數和實際查詢之間更改數據。

+0

謝謝佈雷特。但是,如果我在原始表中有很多記錄,你認爲它會產生額外的開銷嗎?實際上,在計數之後,我限制了rowcount/10的原始查詢。 –

+0

@Jahar tagi:對性能的影響取決於您的原始聲明花費大部分時間。最壞的情況(最可能是imho)「count(*)」將與原始選擇大致相同。 –

+0

@Piet。感謝您的回覆Piet。所以如果我有這兩個查詢,會不會有太多的性能差異? '從emp中選擇count(*),其中id <9000和salary> 50000;' 'select count(*)from(select * from emp where id <9000 and salary> 50000 order by dept,salary desc)as d;'我試着在db服務器上運行,只有2或3毫秒的差異。 –