postgresql 中的 Rownum
有没有办法在 postgresql 中模拟 rownum ?
Is there any way to simulate rownum in postgresql ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
有没有办法在 postgresql 中模拟 rownum ?
Is there any way to simulate rownum in postgresql ?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(8)
PostgreSQL > 8.4
Postgresql > 8.4
Postgresql 有限制。
Oracle的代码:
与Postgresql的代码相同:
Postgresql have limit.
Oracle's code:
same in Postgresql's code:
我刚刚在 Postgres 9.1 中测试了一个接近 Oracle ROWNUM 的解决方案:
I have just tested in Postgres 9.1 a solution which is close to Oracle ROWNUM:
如果您只想返回一个号码,请尝试此操作。
您可以向 inline_v1 SQL 添加 order by,以便您的 ROWNUM 对您的数据具有一定的顺序意义。
可能不是最快的,但如果您确实需要它们,它是一个选择。
If you just want a number to come back try this.
You can add a order by to the inline_v1 SQL so your ROWNUM has some sequential meaning to your data.
Might not be the fastest, but it's an option if you really do need them.
如果您有唯一键,则可以使用
COUNT(*) OVER ( ORDER BY unique_key ) as ROWNUM
演示
If you have a unique key, you may use
COUNT(*) OVER ( ORDER BY unique_key ) as ROWNUM
DEMO
我认为可以使用临时序列来模拟 Oracle rownum。
演示:
给出:
说明:
函数 rownum_seq() 是不可变的,PG 在查询中仅调用一次,因此我们得到相同的唯一序列名称(即使该函数在同一个查询中被调用数千次)
函数 rownum() 是易失性的并由 PG 每次调用(即使在 where 子句中)
如果没有 r 记录参数(未使用),则函数 rownum() 可能会过早求值。这就是棘手的一点。想象一下,下面的 rownum() 函数:
PG 在订单之前应用过滤器。该死!
使用第一个未使用的参数,我们强制 PG 在过滤器之前排序:
优点:
:
I think it's possible to mimic Oracle rownum using temporary sequences.
Demo:
Gives:
Explanations:
Function rownum_seq() is immutable, called only once by PG in a query, so we get the same unique sequence name (even if the function is called thousand times in the same query)
Function rownum() is volatile and called each time by PG (even in a where clause)
Without r record parameter (which is unused), the function rownum() could be evaluated too early. That's the tricky point. Imagine, the following rownum() function:
PG apply the filter before the order. Damned!
With the first unused parameter, we force PG to order before filter:
Pros:
Cons:
Postgresql 没有相当于 Oracle 的 ROWNUM。
在许多情况下,您可以通过在查询中使用 LIMIT 和 OFFSET 来获得相同的结果。
Postgresql does not have an equivalent of Oracle's ROWNUM.
In many cases you can achieve the same result by using LIMIT and OFFSET in your query.
使用 limit 子句和偏移量来选择行号 -1 所以如果你想获得第 8 行,那么使用:
limit 1 offset 7
use the limit clausule, with the offset to choose the row number -1 so if u wanna get the number 8 row so use:
limit 1 offset 7