4

Postgresqlで関数を書く方法を学んでいます。_tmp_myfunction()を取り込んでテーブルを返すという関数を定義しましたid( というテーブル オブジェクト タイプも定義しています_tmp_mytable) 。

-- create object type to be returned
CREATE TYPE _tmp_mytable AS (
    id      integer, 
    cost    double precision
    );

-- create function which returns query
CREATE OR REPLACE FUNCTION _tmp_myfunction(
    id    integer
    )
RETURNS SETOF _tmp_mytable AS $$
BEGIN  
  RETURN QUERY 
  SELECT
    sales.gid,
    cost  
  FROM 
    sales
  WHERE
    id = sales.gid;
  END;
$$ LANGUAGE plpgsql;

これを使用idして、次のアプローチを使用して呼び出すと、これは正常に機能します。

SELECT * FROM _tmp_myfunction(402);

ここに画像の説明を入力

私ができるようにしたいのは、それを呼び出すことですが、1つの値だけではなく、値の列を使用することです. ただし、次のアプローチを使用すると、テーブルのすべての値がカンマで区切られた 1 つの列になります。

-- call function using all values in a column
SELECT _tmp_myfunction(t.id)
FROM transactions as t;

ここに画像の説明を入力

SELECT _tmp_myfunction(402);の代わりに使用しても同じ結果が得られることは理解していSELECT * FROM _tmp_myfunction(402);ますが、値の列を渡すときに複合値を取得しないように関数を構築する方法がわかりません。

4

1 に答える 1

2

あなたはそのようなものを書くことができます:

SELECT (t2.function_row).id,
       (t2.function_row).cost
FROM (SELECT _tmp_myfunction(t.id) as function_row
     FROM transactions  t ) t2;

複合行ではなく、フィールドが表示されます。

于 2012-12-10T23:23:04.973 に答える