PostgreSQL9.4开始支持SQL标准中的WITH ORDINALITY写法,用来返回记录的每一行行号。
当 from语句后面的函数加上 WITH ORDINALITY 属性后,那么返回的结果集将增加一个整数列,这个整数列从1开始,并且按 1 递增。
例子:
1、用法举例
要注意:WITH ORDINALITY必须使用在from子句中,且要紧跟在函数后面使用!
bill@bill=>SELECT * FROM unnest(ARRAY['a','b','c','d','e','f']) WITH ORDINALITY;
unnest | ordinality
--------+------------
a | 1
b | 2
c | 3
d | 4
e | 5
f | 6
(6 rows)
bill@bill=>select * from generate_series(1,4) with ordinality;
generate_series | ordinality
-----------------+------------
1 | 1
2 | 2
3 | 3
4 | 4
(4 rows)
bill@bill=>select * from unnest(array[5,4,3,2,1]) with ordinality;
unnest | ordinality
--------+------------
5 | 1
4 | 2
3 | 3
2 | 4
1 | 5
(5 rows)
2、不支持场景
目前不支持返回record类型的函数。
bill@bill=>create or replace function f_record() returns setof record as $$
bill$# declare
bill$# begin
bill$# return query select relname,relkind from pg_class limit 5;
bill$# end;
bill$# $$ language plpgsql strict;
CREATE FUNCTION
bill@bill=>select * from f_record() as (a name, b "char");
a | b
---------------------------------+---
idx_t1_ccold3 | i
idx_t1_ccold4 | i
pg_toast_50728_index_ccold | i
pg_attribute_relid_attnam_index | i
pg_attribute_relid_attnum_index | i
(5 rows)
```sql
bill@bill=>select * from f_record() with ordinality as (a name, b "char");
ERROR: WITH ORDINALITY cannot be used with a column definition list
LINE 1: select * from f_record() with ordinality as (a name, b "char...
^
HINT: Put the column definition list inside ROWS FROM().
3、其它测试
bill@bill=>SELECT * FROM (VALUES (1),(2),(3)) v(r) LEFT JOIN generate_series(11,13) WITH ORDINALITY AS f(i,o) ON (r+i)<100;
r | i | o
---+----+---
1 | 11 | 1
1 | 12 | 2
1 | 13 | 3
2 | 11 | 1
2 | 12 | 2
2 | 13 | 3
3 | 11 | 1
3 | 12 | 2
3 | 13 | 3
(9 rows)
参考链接:
https://www.postgresql.org/docs/devel/sql-select.html