在Postgres 9.3或更高版本中,使用100连接:
SELECT v.col_a, v.col_b, f.* -- no parentheses, f is a table alias
FROM v_citizenversions v
LEFT JOIN LATERAL f_citizen_rec_modified(v.col1, v.col2) f ON true
WHERE f.col_c = _col_c;
为什么是LEFT JOIN LATERAL ... ON true
?
对于older versions,有一种非常简单的方法可以通过设置返回函数(RETURNS TABLE
or RETURNS SETOF record
OR RETURNS record
)来完成I think的任务:
SELECT *, (f_citizen_rec_modified(col1, col2)).*
FROM v_citizenversions v
函数为外部查询的每一行计算一次值.如果函数返回多行,则结果行将相应相乘.所有parentheses are syntactically required个元素都用于分解一个行类型.table函数可以如下所示:
CREATE OR REPLACE FUNCTION f_citizen_rec_modified(_col1 int, _col2 text)
RETURNS TABLE(col_c integer, col_d text)
LANGUAGE sql AS
$func$
SELECT s.col_c, s.col_d
FROM some_tbl s
WHERE s.col_a = $1
AND s.col_b = $2
$func$;
如果要应用WHERE
子句,因为列在同一级别上不可见,则需要将其包装在子查询或CTE中.(不管怎样,这对性能更好,因为你需要为函数的每个输出列计算prevent repeated evaluation):
SELECT col_a, col_b, (f_row).*
FROM (
SELECT col_a, col_b, f_citizen_rec_modified(col1, col2) AS f_row
FROM v_citizenversions v
) x
WHERE (f_row).col_c = _col_c;
还有其他几种方法可以做到这一点或类似的事情.这完全取决于你到底想要什么.