Arrays PostgreSQL将函数返回的数组转换为列

Arrays PostgreSQL将函数返回的数组转换为列,arrays,function,postgresql,Arrays,Function,Postgresql,我在PostgreSQL(PLPGSQL)中有一个函数,它返回一个包含两个元素的数组。运行调用函数的select语句时,会得到一列,其中包含数组(如预期的那样): 我真正想做的是将这些元素提取为它们自己的列: [ 1 | 2 ] 我发现我可以做到: SELECT (MyFunction())[1], (MyFunction())[2] 但这会调用函数两次,因此运行时间会加倍(此函数非常耗时)。有没有更好的方法来处理这个问题 更新 这是我所拥有的几乎完美的复制品: SELECT table1

我在PostgreSQL(PLPGSQL)中有一个函数,它返回一个包含两个元素的数组。运行调用函数的select语句时,会得到一列,其中包含数组(如预期的那样):

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

[ 1 | 2 ]
我发现我可以做到:

SELECT (MyFunction())[1], (MyFunction())[2]
但这会调用函数两次,因此运行时间会加倍(此函数非常耗时)。有没有更好的方法来处理这个问题


更新

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

SELECT table1.a, table1.b, table1.c, (MyFunction(table1.a, table1.b, table1.c))[1],
(MyFunction(table1.a, table1.b, table1.c))[2]
FROM table1
INNER JOIN table2 using(b)
WHERE ... GROUP BY table1.a, table1.b, 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

编辑:我想我会把整件事包装在一个子选区里;内部子选择生成所需行,外部选择将内部查询投影到所需列中:

内部和外部选择将正确关联
表1
参考

select data[1] as id, data[2] as value from (SELECT 
string_to_array(rs,':') as data from unnest(string_to_array('1:234,2:400',',')) as rs) as foo
这将导致:

id|Value
--------
1 | 234
2 | 400

这是一个常见的“局部变量”技巧,只要数组中的元素数是固定的,它就应该工作。唯一的问题(也许我应该在前面提到)是函数依赖于相同查询级别的其他关系。因此,我选择了“table_id”,并将相同的id传递给函数。这会产生:错误:第一行中表“table1”的子句条目中缺少:SELECT table1.a…您误解了我的注释,如果从MyFunction返回的数组有时有2个条目,有时有5个条目,会发生什么情况?您必须重复
myfunction\u result[]
填充足够的次数,以说明数组中最大可能的条目数。这就是我要说的。@mu太短了:如果返回的数组是可变的,或者通常是长的,那么首先就不应该将它转置到列中。可变集合应保持为数组。我将注意,返回数组中的元素数始终为2…如果返回结果的形状已知,是否应返回数组?这可能是一场争吵。你有能力重构它吗?
select data[1] as id, data[2] as value from (SELECT 
string_to_array(rs,':') as data from unnest(string_to_array('1:234,2:400',',')) as rs) as foo
id|Value
--------
1 | 234
2 | 400