为什么在SELECT列表中使用Set Returning Function(SRF)与在FROM子句中使用SRF之间在行为上有区别?
例如,对于一个简单的SRF返回2行:
CREATE OR REPLACE FUNCTION gen_series(out integer, out int)
RETURNS SETOF record AS $$
SELECT 1,1
UNION
SELECT 2,2;
$$ LANGUAGE SQL;
SELECT gen_series();
返回两个单列行,每个行包含一条记录:
=> gen_series
------------
(1,1)
(2,2)
(2 rows)
而SELECT * FROM gen_series();
返回记录扩展的两行:
=> column1 | column2
---------+---------
1 | 1
2 | 2
(2 rows)
相比之下,如果SRF返回单个列,则在SELECT或FROM子句中调用SRF没有什么区别。例如:
=> SELECT generate_series(1,2);
generate_series
-----------------
1
2
(2 rows)
=> SELECT * FROM generate_series(1,2);
generate_series
-----------------
1
2
(2 rows)
我的问题是:
我不太清楚为什么在第二种情况下,SRF行为与第一种情况不同,只是因为返回的表只有一个列。就类型,元组和集合而言,这真的是一致的行为吗?
导致不同行为的两种情况之间有什么区别?
SRF可以用作如上所示的表格,但是表格也可以用来替代SRF吗?例如
SELECT my_table;
显然,这无法完成,但是为什么SELECT my_SRF();
可行却
SELECT my_table;
不允许这样做(在关系和数学方面)?
SELECT my_table;
是不是有效的语法