我有一个 SQL 查询,我想知道该 SQL 查询将返回多少行。现在的问题是我想事先知道结果的数量,这意味着在运行 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”条款。我也可以通过下面的正则表达式删除“Order By”子句:
Pattern.compile("(?:)from\\s+(.*)*" , Pattern.CASE_INSENSITIVE);
但在嵌套查询的情况下,它会变得更加复杂。
任何 Java Regex 专家都可以帮忙吗???我使用 postgres 作为数据库。
最佳答案
像这样包装现有的查询:
select count(*) from (<existing query>)
根据您给出的示例:
String orgQuery = "select * from emp where id<1210 and salary>55000";
String countQuery = "select count (*) from (" + orgQuery + ')';
我知道这适用于 Oracle。我没有使用过 postgres,所以我不确定是否有任何因素阻止这种方法在那里工作。
但是,我会警告您首先获取计数的想法,因为在执行计数和实际查询之间数据可能会发生变化。
关于Java 正则表达式 : To know the number of rows to be returned by a SQL Query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37725204/