web-dev-qa-db-ja.com

selectの各行の関数を呼び出す-Postgres

「getList(date)」という関数があります。この関数は、パラメーターに入力された日付からアイテムリスト(複数の列を含む)を返します。

私が電話した場合:

SELECT * FROM getList('12/31/2014');

それはうまくいきます。日付、商品名、価格のリストが返されます。

このようなもの:

date        item_description    price
-----------------------------------------------
12/31/2014      banana          1
12/31/2014      Apple           2.5
12/31/2014      coconut         3

しかし、検索したい日付のテーブルがもう1つあります。

したがって、そのテーブルからすべての日付を選択し、返された各行について、関数「getList」を呼び出して次のような結果を得る必要があります。

 date       item_description    price
 -----------------------------------------------
 12/28/2014     banana          0.5
 12/28/2014     Apple           1.5
 12/28/2014     coconut         2
 12/31/2014     banana          1
 12/31/2014     Apple           2.5
 12/31/2014     coconut         3

私はそれを行う方法を正確に知りません。もちろん、私のデータはフルーツリストではありません。これは、全体を簡単に説明するためだけのものです。

どうもありがとうございました。

15
Gilbert

正しい方法-LATERAL参加

これを行う正しい方法は、ラテラルクエリ(PostgreSQL 9.3以降)を使用することです。

SELECT d."date", f.item_description, f.price
FROM mydates d,
     LATERAL getList(d."date") f;

マニュアル を参照してください。

レガシーウェイ-SELECTのSRF

古いバージョンでは、いくつかの...風変わりな...プロパティ、SELECT- listでのset-returning関数のサポートを備えたPostgreSQL拡張機能を使用する必要があります。 PostgreSQL 9.2以前をサポートする必要があることがわかっている場合を除いて、これを使用しないでください。

SELECT d."date", (getList(d."date").*
FROM mydates d;

これにより、出力の各列に1回ずつ、getList関数が複数回評価される可能性があります。

18
Craig Ringer