7

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)

私がやりたいことは、出力を 2 つの別々の列に分割することです。このような:

column, column2
egg, 4

どうすればいいですか?1時間グーグルで検索してもどこにも行きませんでした。したがって、最後にいくつかの検索キーワードを追加したいと思います: 複数の戻り値 複数の結果 複数の列 unnest list unnest set

4

4 に答える 4

8

ええ、これの構文は少し風変わりで、余分な括弧が必要です:

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

関数を 1 回呼び出すだけで出力から複数のコンポーネントを取得するには、サブセレクトを使用できます。

select (x.column).name, (x.column).value from (select make_pair('egg', 4) as column) x;
于 2011-02-01T18:25:23.760 に答える
3
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);
于 2011-02-02T07:35:35.313 に答える
2

私が見つけた解決策は、結合を使用することでした:

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)
于 2014-02-03T06:52:01.967 に答える
1

以下は、関数を2回実行する必要をなくし、同時にサブクエリを回避するための作業コードです。

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
于 2011-02-01T19:36:54.707 に答える