我有一个SQL查询,我想知道SQL查询将返回多少行。现在的问题是我想事先知道结果的数量,这意味着在运行SQL查询之前。
我可以通过ResultSet.getRow()
轻松完成此操作,以获取结果集中的总行数。但是根据要求,我只有在知道该查询返回的行数后才能获得结果集。
我尝试使用以下Java Regex解决问题:
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”条款。我也可以通过以下正则表达式删除“Order By”条款:
Pattern.compile("(?:)from\\s+(.*)*" , Pattern.CASE_INSENSITIVE);
但是在嵌套查询的情况下它变得更加复杂。
任何Java Regex专家都可以帮忙?????我使用postgres作为DB。
答案 0 :(得分: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,所以我不确定是否会有任何阻止这种方法在那里工作的东西。
我会先注意这个先计算的想法,然而,数据可能会在执行计数和实际查询之间发生变化。