postgresql:将CTE列转换为数组

时间:2017-11-01 15:15:07

标签: postgresql function common-table-expression

我正在尝试将CTE的一列转换为数组。我继续“语法错误在或接近”,然后是“ret:= array(”。

我的目标是,我在下面示例中从a_function()返回的表格是存储作为稍后在函数中引用的变量。但我找不到这样做的语法。因此,如果我可以使用其他东西,而不是使用CTE,那就可以很好地工作了。

注意:我在pgAdmin III中尝试这个。

create or replace function a_function()
--returns int[][] as
returns table(column1 int, column2 int) as
$body$
begin
   return query
      select 1,2;


end;
$body$
language 'plpgsql'
;



--select * from a_function();

create or replace function test_a_function()
returns void as
$body$
declare ret int[];
begin
   with ret_cte(column1, column2) as (
      select * from a_function()
   )

   ret := array(
      select column1 from ret_cte
   )
   ;
   --raise notice '%', array_to_string(ret, ',');
end;
$body$
language 'plpgsql'
;

--select test_a_function();

2 个答案:

答案 0 :(得分:0)

  

我正在尝试将CTE的一列转换为数组。我继续在"或附近获得"语法错误然后是" ret:= array("

您可以使用:

ret :=array(with ret_cte(column1, column2) as (
               select * from a_function()
            )
            select column1 from ret_cte
       );

<强> Rextester Demo

答案 1 :(得分:0)

可以使用array_agg()函数构建和返回数组。例如,您的第二个函数可以使用SQL语言函数编写,该函数返回数组,如下所示:

model.frame(mpg ~ hp, data = mtcars)
model.frame(mtcars$mpg ~ mtcars$hp)

或者,您可以将数组分配给这样的变量:

create or replace function test_a_function()
returns int[] as
$body$
   select array_agg(column1) from a_function();
$body$
language 'sql';