gpt4 book ai didi

arrays - 将函数返回的数组转换为列

转载 作者:行者123 更新时间:2023-11-29 11:17:20 25 4
gpt4 key购买 nike

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

{1, 2}

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

[ 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;

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

最佳答案

可以使用子选择吗?

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, 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;

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

关于arrays - 将函数返回的数组转换为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6960247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com