如何在Postgres中将类型拆分为多个列?

时间:2011-02-01 18:11:32

标签: postgresql plpgsql plperl

我有以下代码从pl / python返回多个值:

CREATE TYPE named_value AS (
  name   text,
  value  integer
);
CREATE or replace FUNCTION make_pair (name text, value integer)
  RETURNS named_value
AS $$
  return [ name, value ]
$$ LANGUAGE plpythonu;

select make_pair('egg', 4) as column;

输出结果为:

column
(egg,4)

我想要做的是将输出分成两个单独的列。像这样:

column, column2
egg, 4

我该怎么做?用Google搜索了1个小时让我无处可去。所以我希望最后会添加一些搜索关键字: 多个返回值多个结果多列不列表不需要设置

4 个答案:

答案 0 :(得分:6)

是的,这个语法有点古怪,需要额外的括号:

select (make_pair('egg', 4)).name

要从输出中获取多个组件而只调用一次该函数,可以使用子选择:

select (x.column).name, (x.column).value from (select make_pair('egg', 4) as column) x;

答案 1 :(得分:2)

SELECT * FROM make_pair('egg', 4);

和一些变种:

 SELECT name, value FROM make_pair('egg', 4) AS x;


 SELECT a, b FROM make_pair('egg', 4) AS x(a,b);

答案 2 :(得分:2)

我找到的解决方案是使用join:

create table tmp (a int, b int, c int);
insert into tmp (a,b,c) values (1,2,3), (3,4,5), (5,12,13);
create type ispyth3 as (is_it boolean, perimeter int);
create function check_it(int, int, int) returns ispyth3 as $$
    begin
        return ($1*$1 + $2*$2 = $3*$3, $1+$2+$3);
    end
$$ language plpgsql;
select * from tmp join check_it(a,b,c) on 1=1;

返回:

 a | b  | c  | is_it | perimeter 
---+----+----+-------+-----------
 1 |  2 |  3 | f     |         6
 3 |  4 |  5 | t     |        12
 5 | 12 | 13 | t     |        30
(3 rows)

答案 3 :(得分:1)

以下是工作代码,以避免必须运行该函数两次,同时避免使用子查询。

CREATE TYPE named_value AS (
  name   text,
  value  integer
);

CREATE or replace FUNCTION setcustomvariable(variablename text, variablevalue named_value)
  RETURNS named_value
AS $$
  GD[variablename] = variablevalue
  return variablevalue
$$ LANGUAGE plpythonu;

CREATE or replace FUNCTION getcustomvariable(variablename text)
  RETURNS named_value
AS $$
  return GD[variablename]
$$ LANGUAGE plpythonu;

CREATE or replace FUNCTION make_pair (name text, value integer)
  RETURNS named_value
AS $$
  return [ name, value ]
$$ LANGUAGE plpythonu;

select setcustomvariable('result', make_pair('egg', 4)), (getcustomvariable('result')).name, (getcustomvariable('result')).value