添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

oracle中的rownum是一个虚拟列,每输出一行递增1。但是在pg中目前没有rownum虚拟列,那么如果从oracle迁移到pg该如何实现呢?
要在pg中实现rownum我们得先弄清楚oracle中的rownum有什么作用,是如何使用的。
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数。 https://www.cndba.cn/foucus/article/4133

rownum使用场景1:分页输出
oracle中分页: https://www.cndba.cn/foucus/article/4133 https://www.cndba.cn/foucus/article/4133 https://www.cndba.cn/foucus/article/4133 https://www.cndba.cn/foucus/article/4133

SQL> select * from t1 where rownum=1;
----------
SQL> select * from t1 where rownum<3;
----------

pg中分页:
pg自带的limit语法就可以很好的替代oracle中使用rownum分页的情况。https://www.cndba.cn/foucus/article/4133 https://www.cndba.cn/foucus/article/4133

bill=# select * from t1 limit 1;
 id |               info               
----+----------------------------------
  1 | 4b6a755d1e1867cf1c49e841032df9ac
(1 row)
bill=# select * from t1 limit 1 offset 1;
 id |               info               
----+----------------------------------
  2 | 963ffeef5f97757767e4a9af66ea61db
(1 row)

rownum使用场景2:生成序列值
oracle中可以使用rownum递增的特性来生成序列值。
oracle: https://www.cndba.cn/foucus/article/4133 https://www.cndba.cn/foucus/article/4133

SQL> ALTER TABLE t1 ADD seqno NUMBER(3);  
SQL> UPDATE t1 SET seqno = ROWNUM;

pg:
pg中可以使用临时序列来为某个字段生成序列值。

bill=# create temp sequence if not exists tmp_seq;  
CREATE SEQUENCE
bill=# alter sequence tmp_seq restart with 1;  
ALTER SEQUENCE
bill=# alter table t1 add column col1 int; 
ALTER TABLE
bill=# update t1 set col1=nextval('tmp_seq');  
UPDATE 10
bill=# select * from t1;
 id |               info               | col1 
----+----------------------------------+------
  1 | 4b6a755d1e1867cf1c49e841032df9ac |    1
  2 | 963ffeef5f97757767e4a9af66ea61db |    2
  3 | abd59f7046720b700e267e16d7f9bab3 |    3
  4 | 5e1839939b64b7a50eb5471e90b9e299 |    4
  5 | 24907f7103042b4e4acf7176a019e7bc |    5
  6 | c7632e2705fea35ddd6b9aa5f1413947 |    6
  7 | aea6eb309fd74a45650b1ed39d8b2724 |    7
  8 | 2ce882fe6ccee470b4b86e7aa9196f2e |    8
  9 | 5a8a05706851b9773cde048e3a362fcc |    9
 10 | c27fe91e6f80feec6914d7917b489d14 |   10
(10 rows)

除此之外,我们还可以使用窗口函数来实现行号这类功能。

bill=# select row_number() over () as rownum, * from t1;
 rownum | id |               info               | col1 
--------+----+----------------------------------+------
      1 |  1 | 4b6a755d1e1867cf1c49e841032df9ac |    1
      2 |  2 | 963ffeef5f97757767e4a9af66ea61db |    2
      3 |  3 | abd59f7046720b700e267e16d7f9bab3 |    3
      4 |  4 | 5e1839939b64b7a50eb5471e90b9e299 |    4
      5 |  5 | 24907f7103042b4e4acf7176a019e7bc |    5
      6 |  6 | c7632e2705fea35ddd6b9aa5f1413947 |    6
      7 |  7 | aea6eb309fd74a45650b1ed39d8b2724 |    7
      8 |  8 | 2ce882fe6ccee470b4b86e7aa9196f2e |    8
      9 |  9 | 5a8a05706851b9773cde048e3a362fcc |    9
     10 | 10 | c27fe91e6f80feec6914d7917b489d14 |   10
(10 rows)

总结:
尽管pg中不支持oracle的rownum语法,但是我们可以针对oracle中rownum不同的使用场景制定对应的解决方案来支持同样的场景。https://www.cndba.cn/foucus/article/4133

版权声明:本文为博主原创文章,未经博主允许不得转载。