postgresql中的Rownum

dan*_*car 70 postgresql rownum

有没有办法在postgresql中模拟rownum?

bak*_*048 83

Postgresql> 8.4

SELECT 
    row_number() OVER (ORDER BY col1) AS i, 
    e.col1, 
    e.col2, 
    ... 
FROM ... 
Run Code Online (Sandbox Code Playgroud)

  • 小心.这类似于oracle的rownum,但它略有不同.Oracle的rownum是在从磁盘读取行时分配的,而这个row_number()是根据你的OVER中的内容分配的. (12认同)

小智 22

我刚刚在Postgres 9.1中测试了一个接近Oracle ROWNUM的解决方案:

select row_number() over() as id, t.*
from information_schema.tables t;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这不会考虑外部查询中的"ORDER BY". (4认同)

小智 16

Postgresql有限制.

Oracle的代码:

select *
from
  tbl
where rownum <= 1000;
Run Code Online (Sandbox Code Playgroud)

同样在Postgresql的代码中:

select *
from
  tbl
limit 1000
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢 ANSI SQL:2008 语法:仅 FETCH N ROWS(适用于 Oracle 12、Postgres...)检查文档:https://www.postgresql.org/docs/current/sql-select.html (2认同)

Kub*_*aun 9

如果你只想要一个号码回来试试这个.

create temp sequence temp_seq;
SELECT inline_v1.ROWNUM,inline_v1.c1
FROM
(
select nextval('temp_seq') as ROWNUM, c1 
from sometable
)inline_v1;
Run Code Online (Sandbox Code Playgroud)

您可以通过inline_v1 SQL添加订单,以便您的ROWNUM对您的数据具有一些连续的含义.

select nextval('temp_seq') as ROWNUM, c1 
from sometable
ORDER BY c1 desc;
Run Code Online (Sandbox Code Playgroud)

可能不是最快的,但如果你真的需要它,它是一个选择.