1

PostgreSQL 9.2 を使用して、引数を 1 つ取り、複数列のテーブルを返す関数を定義しました。その関数を CTE の行にある複数の引数に適用したいと考えています。私が得ている結果は、私が望む複数の列ではなく、タプルの単一の列です。ウィット:

sandbox=# CREATE FUNCTION myfunc(arg int) RETURNS table(col1 int, col2 int) AS
sandbox-# 'SELECT arg+1, arg+2'
sandbox-# LANGUAGE SQL;
CREATE FUNCTION
sandbox=# select * from myfunc(1);
 col1 | col2 
------+------
    2 |    3
(1 row)

sandbox=# WITH rows AS (
sandbox(#   SELECT 1 AS arg UNION SELECT 2 AS arg
sandbox(# )
sandbox-# SELECT * FROM (SELECT myfunc(arg) FROM rows) x;
 myfunc 
--------
 (2,3)
 (3,4)
(2 rows)

CTE を指定すると、次の 2 つのSELECT句は、 type の単一の列を持つテーブルとして互いに同じように評価されますrecord

SELECT myfunc(arg) FROM rows;
SELECT * FROM (select myfunc(arg) FROM rows) x;

そして、次の 3 つはすべて失敗します (CTE は示されていません)。

SELECT myfunc(arg).col1 FROM rows;
ERROR:  syntax error at or near "."
LINE 4: SELECT myfunc(arg).col1 FROM rows;
                          ^

SELECT col1 FROM (select myfunc(arg) FROM rows) x;
ERROR:  column "col1" does not exist
LINE 4: SELECT col1 FROM (select myfunc(arg) FROM rows) x;
               ^

SELECT col1 FROM (SELECT * FROM (select myfunc(arg) FROM rows) x) y;
ERROR:  column "col1" does not exist
LINE 4: SELECT col1 FROM (SELECT * FROM (select myfunc(arg) FROM row...
               ^

タプルの単一列にある値を含む複数列テーブルを取得するにはどうすればよいですか?

4

1 に答える 1

5

myfunc を余分な括弧で囲むことが重要です。

select (myfunc(arg)).* from rows;
于 2013-10-02T08:51:16.260 に答える