这实际上是Dynamically generate columns for crosstab in PostgreSQL
的后续行动要明确:如果我的数据集具有可变数量的键,我就无法生成AS子句?
EG。 最初与学生(汤姆,迪克,哈利)进行测试(测试,学生,结果)的表格
这个交叉表将是:
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)
Sally加入后会失败吗?有点像
ERROR: invalid return type
DETAIL: Query-specified return tuple has 4 columns but crosstab returns 5.
答案 0 :(得分: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(在同一事务中应用程序中必须是FETCHED,请注意这与pgAdmin不兼容),或者您需要返回JSON或XML类型。请注意,根据您的PostgreSQL版本(JSON需要PostgreSQL 9.1或更高版本,可能带有插件),行可以转换为JSON和XML而不会有太多麻烦。