我有以下函数,基于PG文档的SQL Functions Returning Sets部分,它接受两个长度相等的数组,并将它们解压缩为一组有两列的行。
CREATE OR REPLACE FUNCTION unpack_test(
in_int INTEGER[],
in_double DOUBLE PRECISION[],
OUT out_int INTEGER,
OUT out_double DOUBLE PRECISION
) RETURNS SETOF RECORD AS $$
SELECT $1[rowx] AS out_int, $2[rowx] AS out_double
FROM generate_series(1, array_upper($1, 1)) AS rowx;
$$ LANGUAGE SQL STABLE;
我在PGAdmin3中执行该功能,如下所示:
SELECT unpack_test(int_col, double_col) FROM test_data
它基本上有效,但输出如下:
|unpack_test|
|record |
|-----------|
|(1, 1) |
|-----------|
|(2, 2) |
|-----------|
...
换句话说,结果是单个记录,而不是两列。我发现this question似乎提供了一个答案,但它处理的是一个直接从表中选择的函数,而我接受列作为参数,因为它需要生成用于迭代它们的系列。因此,我无法使用SELECT * FROM function
来调用它,正如答案所示。
答案 0 :(得分:3)
首先,您需要create a type来获取函数的返回值。这样的事情可以奏效:
CREATE TYPE unpack_test_type AS (out_int int, out_double double precision);
然后更改您的函数以返回此类型,而不是record
。
然后你可以像这样使用它:
SELECT (unpack_test).out_int, (unpack_test).out_double FROM
(SELECT unpack_test(int_col, double_col) FROM test_data) as test
似乎不可能采用返回通用记录类型的函数并以这种方式使用它。