我想从PostgreSQL表中选择范围或行。我试过这段代码:
{{1}}
但是当我使用分页时,我得到不同的数字或行。如果我使用Oracle的查询,它运行正常。但是当我想使用PostgreSQL中的查询时,我会在每个分页页面上得到不同的结果。你能给我一些结果如何解决这个问题吗?
答案 0 :(得分:1)
PostgreSQL中的参数getView()
和OFFSET
在documentation中描述为:
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
包含要检索的总行数,则必须将其分配给firstRow
和OFFSET
至countrow
。如果使用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