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
版权声明:本文为博主原创文章,未经博主允许不得转载。