2013-05-22 40 views
1

AS子句這實際上是一個跟進Dynamically generate columns for crosstab in PostgreSQL動態生成的Postgres交叉

要明確:如果我有鑰匙的可變數目我不能生成AS子句的數據集?

例如, 與測試(testdate,瞳孔,結果)最初與學生的表格(湯姆,迪克,哈里)

造成這種情況的交叉將是:

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. 

回答

0

PostgreSQL需要知道計劃過程中的返回類型和結構,因此不能直接返回動態數量的列。通常,你想要做的兩件事情之一:

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

解決這個問題的另一種方法是要返回的動態計算一個類型,其可以存儲各種數據,然後在函數內執行這些或存儲過程返回列。這稍微複雜一點,所以這裏沒有一個例子是真正的問題。儘管如此,請參閱PL/PGSQL函數。

但關鍵是您需要將每一行作爲單個實體返回。您可以使用行標記,或者您可以返回一個refcursor(必須在同一個事務中的應用程序中獲取,請注意,這對於pgAdmin不適用),或者您需要返回JSON或XML類型。請注意,根據您的PostgreSQL版本(JSON需要PostgreSQL 9.1或更高版本,可能帶有插件),行可以轉換爲JSON和XML,而不會有太多麻煩。