1

这实际上是对在 PostgreSQL 中为交叉表动态生成列的后续操作

需要明确的是:如果我有一个包含可变数量键的数据集,我无法生成 AS 子句?

例如。一张带有测试(测试日期、学生、结果)的表格,最初是学生(汤姆、迪克、哈里)

交叉表将是:

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在规划时需要知道返回类型和结构,所以不能直接返回动态列数。通常,您想做以下两件事之一:

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:返回文本引用、json 或 xml

解决此问题的另一种方法是返回一个可以存储各种数据的类型,然后在动态计算返回列的函数或存储过程中执行这些数据。这稍微复杂一些,所以这里的问题并不是一个例子。详情请参阅 PL/PGSQL 函数。

但关键是您需要将每一行作为一个实体返回。您可以使用行表示法,也可以返回一个 refcursor(必须在同一事务中的应用程序中 FETCHED,注意这不适用于 pgAdmin),或者您需要返回 JSON 或 XML 类型。请注意,根据您的 PostgreSQL 版本,行可以轻松转换为 JSON 和 XML(JSON 需要 PostgreSQL 9.1 或更高版本,可能带有插件)。

于 2013-06-09T07:22:11.990 回答