1

これは実際には、PostgreSQL でクロス集計の列を動的に生成するのフォローアップです。

明確にするために:可変数のキーを持つデータセットがある場合、AS句を生成できませんか?

例えば。最初に生徒 (Tom、Dick、Harry) を含むテスト (テスト日、生徒、結果) を含むテーブル

このクロス集計は次のようになります。

select * from crosstab(
'select testdate, pupil, result from tests)',
'select distinct pupil from tests order by pupil')
as ct
(  
"testdate" text,
"Dick" text,
"Harry" text,
"Tom" text)

サリーが参加するとすぐに失敗しますか? のようなもので

ERROR:  invalid return type
DETAIL:  Query-specified return tuple has 4 columns but crosstab returns 5.
4

1 に答える 1

0

PostgreSQL は計画中に戻り値の型と構造を知る必要があるため、動的な数の列を直接返すことはできません。通常、次の 2 つのいずれかを行います。

1: 結果を制限する

このアプローチは次のようになります。

select * from crosstab(
'select testdate, pupil, result from tests)',
'select distinct pupil from tests where pupil in (''Dick'', ''Harry'', ''Tom'') order by pupil')
as ct
(  
"testdate" text,
"Dick" text,
"Harry" text,
"Tom" text)

そうすれば、サリーが現れても見つからないだけです。

2: テキスト refcursor、json、または xml を返す

これを回避するもう 1 つの方法は、さまざまなデータを格納できる型を返し、返される列を動的に計算する関数またはストアド プロシージャ内でこれらを EXECUTE することです。これは少し複雑なので、例はここでは問題になりません。詳細については、PL/PGSQL 関数を参照してください。

ただし、重要なことは、各行を単一のエンティティとして返す必要があるということです。行表記を使用するか、refcursor を返すことができます (同じトランザクション内のアプリケーションで FETCHED にする必要があります。これは pgAdmin ではうまく機能しないことに注意してください)。または、JSON または XML 型を返す必要があります。PostgreSQL のバージョンによっては、あまり問題なく行を JSON および XML に変換できることに注意してください (JSON には PostgreSQL 9.1 以降が必要で、場合によってはアドオンが必要です)。

于 2013-06-09T07:22:11.990 に答える