【发布时间】:2017-03-03 05:10:03
【问题描述】:
我有一个程序,其中用户提供了一个可以在数据库上执行的 sql 查询(要运行的数据库的详细信息也由用户提供)。此查询在数据库上执行,稍后处理结果。
一项新功能要求以分页方式执行查询,即如果用户的查询将正常返回 20 条记录,并且用户提供的页面大小为 5,则查询应执行 4 次,每次检索 5 条记录时间。
我可以为没有 CTE 的选择查询执行此操作,但我不确定如何处理包含 CTE 的一般查询。
我将 CTE 的查询修改如下:
public static String rewrite(String sql) {
return "select * from ("
+ "select (row_number() over ()) as generated_row_number, t.* "
+ "from ("
+ sql
+ ") as t"
+ ") "
+ "where generated_row_number < ?"
+ " and generated_row_number >= ?";
}
起始索引和页面大小稍后作为参数添加。
我将如何处理包含 CTE 的查询的类似功能?
可以假设数据库是 DB2,但最好使用通用解决方案。
连接到数据库的用户也没有创建视图的权限。
【问题讨论】:
-
使用偏移量怎么样? "order by 1 offset 10((page number - 1) * pagesize) ROWS fetch NEXT 5(your page size) ROWS ONLY"