2016-11-24 8 views
-2

テーブルの行を1つ返す関数を作成しますが、他のテーブルのいくつかの追加の列は結合することができます。どうやってやるの?私は新しいタイプを宣言すべきですか?または、テーブルタイプを返す必要がありますか?Postgresqlで追加の列を1行だけ返します

+4

あなたの問題をよく説明し、何を試してみたかを教えてください。 \t [** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t [**スタート**] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)質問品質を改善し、より良い回答を得る方法を学ぶことができます。 –

+0

@JuanCarlosOropeza、何が分かりませんか? – Kumaro

+0

新しいタイプとテーブルタイプについて何か知っていても、あなたは何の努力もしていませんでした。だから、怠惰な質問に親切に見える。 –

答えて

0

追加の列を追加できないため、テーブルの複合型の値を返すことはできません。

あなたは可能性があり、次のいずれか

  1. 任意の固定構造を持たないRECORDの種類を、あなたが返すようにしたい列を含む新しい複合型を宣言し、または

  2. 戻ります。そのシナリオでは、他のテーブルに結合されたテーブルの行を抽出したクエリの結果行を返します。

ご提供いただいたごくわずかな情報に基づいて、RECORDが最も簡単になります。

参照:

UPDATE:テストusin後レコードタイプでは、使用するのに多少不便です。この例を考えてみましょう:

CREATE TABLE a(id SERIAL PRIMARY KEY, foo TEXT, bar INT); 
CREATE TABLE b(id SERIAL PRIMARY KEY, aid INT, baz TEXT); 
INSERT INTO a(foo,bar) VALUES('apples', 25); 
INSERT INTO b(aid, baz) VALUES(1, 'bananas'); 

CREATE OR REPLACE FUNCTION TEST(p_id INT) RETURNS SETOF RECORD AS $$ 
BEGIN 
    RETURN QUERY SELECT a.id,foo,bar,baz FROM a LEFT JOIN b ON a.id=b.aid WHERE A.ID=p_id; 
END; 
$$ LANGUAGE plpgsql; 

あなたは単純に、このようにそれを使用しようとする:あなたはそれを呼び出すようにしたいたびに、あなたはこのような列定義のリストを指定する必要があります、実際には

psql=> SELECT * FROM TEST(1); 
ERROR: a column definition list is required for functions returning "record" 
LINE 1: SELECT * FROM TEST(1); 
        ^

:それはあなたの意図された使用のケースだ場合

psql=> SELECT * FROM TEST(1) AS test(id int, foo text, bar int, baz text); 
id | foo | bar | baz 
----+--------+-----+--------- 
    1 | apples | 25 | bananas 
(1 row) 

そう、私はCraigが概説したアプローチ以下をお勧めします。

1

RETURNS TABLEを使用して、元のテーブルのすべての列とすべての新しい列を列挙します。

the manualを参照してください。

また、表タイプと余分な列を戻すことができるため、コンポジット型のフィールドを作成できます。

RETURNS TABLE (tablerow table_type, extracol1 integer, extracol2 text) 
関連する問題