这是我最理想的想法.想象一下,我有一个表A.
我想要做:
- SELECT A,func(A) FROM table
并且输出要说4列.
有没有办法做到这一点?我已经看到了自定义类型的东西,或者让你得到一个结果的样子
A,(B,C,D)
但是如果我可以让一个函数返回多个列,那么这将是非常好的.
有什么可以做这样的事情吗?
如果函数func只返回1行3个值,例如:
- CREATE OR REPLACE FUNCTION func
- (
- input_val integer,OUT output_val1 integer,OUT output_val2 integer,OUT output_val3 integer
- )
- AS $$
- BEGIN
- output_val1 := input_val + 1;
- output_val2 := input_val + 2;
- output_val3 := input_val + 3;
- END;
- $$LANGUAGE plpgsql;
然后你执行SELECT a,func(a)FROM table1你会得到:
- a | func
- integer | record
- ========|==========
- 1 | (2,3,4)
- 2 | (3,4,5)
- 3 | (4,5,6)
但是,如果您执行:
- SELECT a,(f).output_val1,(f).output_val2,(f).output_val3
- FROM (SELECT a,func(a) AS f FROM table1) AS x
你会得到:
- a | output_val1 | output_val2 | output_val3
- integer | integer | integer | integer
- ========|=============|=============|=============
- 1 | 2 | 3 | 4
- 2 | 3 | 4 | 5
- 3 | 4 | 5 | 6
或者,使用CTE(通用表表达式),如果执行:
- WITH temp AS (SELECT a,func(a) AS f FROM table1)
- SELECT a,(f).output_val3 FROM temp
你也会得到:
- a | output_val1 | output_val2 | output_val3
- integer | integer | integer | integer
- ========|=============|=============|=============
- 1 | 2 | 3 | 4
- 2 | 3 | 4 | 5
- 3 | 4 | 5 | 6
注意:您也可以使用以下查询获得相同的结果:
- SELECT a,(f).*
- FROM (SELECT a,func(a) AS f FROM table1) AS x
要么
- WITH temp AS (SELECT a,(f).* FROM temp