从PostgreSQL表中选择行范围

时间:2016-03-30 19:30:20

标签: java sql postgresql postgresql-9.3

我想从PostgreSQL表中选择范围或行。我试过这段代码:

{{1}}

但是当我使用分页时,我得到不同的数字或行。如果我使用Oracle的查询,它运行正常。但是当我想使用PostgreSQL中的查询时,我会在每个分页页面上得到不同的结果。你能给我一些结果如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

PostgreSQL中的参数getView()OFFSETdocumentation中描述为:

  

LIMIT子句由两个独立的子句组成:

LIMIT
     

count 指定要返回的最大行数,而开始   指定在开始返回行之前要跳过的行数。   如果同时指定了两者,则在开始之前跳过开始行   计算要返回的 count 行。

这意味着这一行:

LIMIT { count | ALL } OFFSET start

可能是错的。传递给LIMIT的参数是实际的行数,而不是下一行。

第二个重要的事情是,在您的陈述中,偏移的问号是第一个,限制的问号是第二个。但是你设置这样的参数:

int countrow = firstRow + rowCount;

第一个是(坏)“计数”,第二个是“偏移”。这应该是另一种方式。

最后, ps.setInt(1, countrow); ps.setInt(2, firstRow); 值是要跳过的行数,而不是第一行的数量。因此,如果您希望第一页的OFFSET为1,则应使用firstRow作为偏移量。

因此,您应该将firstRow - 1行替换为:

setInt

答案 1 :(得分:0)

让我们把关键句子放在一起

LIMIT

PostgreSQL中的参数OFFSET用于指定要检索的最大行数,即每页的行数。

参数 To retrieve the first page -> `LIMIT 50 OFFSET 0` [rows 0 to 49] To retrieve the second page -> `LIMIT 50 OFFSET 50` [rows 50 to 99] ... To retrieve the nth page -> `LIMIT 50 OFFSET (n - 1)*50` 确定哪个是要检索的第一行。

假设您希望每页50行。

rowCount

如果您的LIMIT包含要检索的总行数,则必须将其分配给firstRowOFFSETcountrow。如果使用PostgreSQL,可以丢弃变量 ps.setInt(1, firstRow); // Assign firstRow to OFFSET ps.setInt(2, rowCount); // Assign rowCount to LIMIT

更新:只需更改

  YES ->  ps.setInt(1, firstRow);
  NO  ->  ps.setInt(1, firstRow - 1);

我担心我同意RealSkeptic:" 如果你希望第一页的firstRow为1,你应该使用firstRow - 1作为你的偏移量。&# 34; 如果您获得负数作为第一个参数,唯一的原因是因为您使用0作为起始行

如果您认为Oracle中的第一行有ROWNUM = 1,那就没有意义。

https://docs.oracle.com/cd/B14117_01/server.101/b10759/pseudocolumns008.htm

您对Oracle有效的查询代表RN> 0表示第一页。

PostgreSQL中的第一行是使用OFFSET = 0获得的,所以......

.ab-content