crosstabN(text sql)
crosstabN系列函数是为普通crosstab函数设置自定义封装器的示例,这样不需要在调用的SELECT查询中写出列名和类型。tablefunc模块包括crosstab2、crosstab3以及crosstab4,它们的输入行类型被定义为:
CREATE TYPE tablefunc_crosstab_N AS ( row_name TEXT, category_1 TEXT, category_2 TEXT, . . . category_N TEXT );
因此,当输入查询产生类型为text的列row_name和value并且想要2、3或4个输出值列时,函数可以被直接使用。在所有其他方法中,它们的行为都和上面的一般crosstab函数完全相同。
例如,前一节给出的示例也可以这样来做:
SELECT * FROM crosstab3( 'select rowid, attribute, value from ct where attribute = ''att2'' or attribute = ''att3'' order by 1,2');
这些函数主要是出于举例的目的而提供。可以基于底层的crosstab()函数创建自己的返回类型和函数。有两种方法来做:
与uxdbinstall/dbsql/share/extension/tablefunc--1.0.sql中相似,创建一个组合类型来描述所期望的输出列。然后定义一个唯一的函数名,它接受一个text参数并且返回setof your_type_name,但是链接到同样的底层crosstab C函数。例如,如果源数据产生为text类型的行名称,值是float8,并且想要5个值列:
CREATE TYPE my_crosstab_float8_5_cols AS ( my_row_name text, my_category_1 float8, my_category_2 float8, my_category_3 float8, my_category_4 float8, my_category_5 float8 ); CREATE OR REPLACE FUNCTION crosstab_float8_5_cols(text) RETURNS setof my_crosstab_float8_5_cols AS '$libdir/tablefunc','crosstab' LANGUAGE C STABLE STRICT;
使用OUT参数来隐式定义返回类型。同样的示例也可以这样来做:
CREATE OR REPLACE FUNCTION crosstab_float8_5_cols( IN text, OUT my_row_name text, OUT my_category_1 float8, OUT my_category_2 float8, OUT my_category_3 float8, OUT my_category_4 float8, OUT my_category_5 float8) RETURNS setof record AS '$libdir/tablefunc','crosstab' LANGUAGE C STABLE STRICT;