我有以下功能,基于SQL Functions Returning Sets PG 文档的部分,它接受两个长度相等的数组,并将它们解压成一组具有两列的行。
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 来调用它。
最佳答案
首先,您需要 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
似乎不可能采用返回通用记录类型的函数并以这种方式使用它。
关于sql - 定义返回多列的 Postgres SQL-lang 函数的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7165552/