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

lig*_*nic 9 arrays postgresql function

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

{1, 2}
Run Code Online (Sandbox Code Playgroud)

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

[ 1 | 2 ]
Run Code Online (Sandbox Code Playgroud)

我发现我能做到:

SELECT (MyFunction())[1], (MyFunction())[2]
Run Code Online (Sandbox Code Playgroud)

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


UPDATE

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

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;
Run Code Online (Sandbox Code Playgroud)

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

Sin*_*ion 8

你能用subselect吗?

postgres=# select ar[1], ar[2] from (select string_to_array('a b c', ' ') ar) as sq;
 ar | ar 
----+----
 a  | b
(1 row)
Run Code Online (Sandbox Code Playgroud)

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

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

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

内部和外部选择将正确地关联table1参考.

  • @mu 太短:如果返回的数组是可变的,或者只是一般*长*,那么它不应该首先转置到列中。可变参数集合应该“保留”为数组。 (2认同)