数组 – 从函数返回到列的PostgreSQL转换数组

我在Postgresql(PLPGsql)中有一个函数,它返回一个包含两个元素的数组.当我运行一个调用函数的select语句时,我得到一个包含该数组的列(如预期的那样):
{1,2}

我真正想要做的是将这些元素提取为自己的列:

[ 1 | 2 ]

我发现我能做到:

SELECT (MyFunction())[1],(MyFunction())[2]

但是它会调用函数两次,因此运行时间加倍(此函数是一个非常耗时的函数).有没有更好的方法来处理这个?

UPDATE

这是我所拥有的几乎完美的复制品:

SELECT table1.a,table1.b,table1.c,(MyFunction(table1.a,table1.c))[1],table1.c))[2]
FROM table1
INNER JOIN table2 using(b)
WHERE ... GROUP BY table1.a,table1.c;

同样,这会产生数组中的两列,但我的函数调用两次,这使我的运行时间加倍.

你能用subselect吗?
postgres=# select ar[1],ar[2] from (select string_to_array('a b c',' ') ar) as sq;
 ar | ar 
----+----
 a  | b
(1 row)

这仍然需要您显式提取每列(就像您已经做过的那样).如果数组中的元素多于提取的元素,则它们将丢失,如果元素数量较少,则缺少的列将仅为NULL.

编辑:我想我会把整个东西包裹在一个子选择中;内部子选择生成所需的行,外部选择将内部查询投影到所需的列中:

SELECT subquery1.a,subquery1.b,subquery1.c,myfunction_result[1],myfunction_result[2] 
FROM ( SELECT table1.a,MyFunction(table1.a,table1.c) as myfunction_result
       FROM table1 INNER JOIN table2 using(b) 
       WHERE ... GROUP BY table1.a,table1.c
) AS subquery1;

内部和外部选择将正确关联table1引用.

相关文章

来源:http://www.postgres.cn/docs/11/ 4.1.1. 标识符和关键词 SQL标识符和关键词必须以一个...
来源:http://www.postgres.cn/docs/11/ 8.1. 数字类型 数字类型由2、4或8字节的整数以及4或8...
来源:http://www.postgres.cn/docs/11/ 5.1. 表基础 SQL并不保证表中行的顺序。当一个表被读...
来源:http://www.postgres.cn/docs/11/ 6.4. 从修改的行中返回数据 有时在修改行的操作过程中...
来源:http://www.postgres.cn/docs/11/ 13.2.1. 读已提交隔离级别 读已提交是PostgreSQL中的...
来源:http://www.postgres.cn/docs/11/ 9.7. 模式匹配 PostgreSQL提供了三种独立的实现模式匹...