PostgreSQL WITH ORDINALITY函数使用

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

发布了155 篇原创文章 · 获赞 88 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_39540651/article/details/105406446