In Postgres 9.3 of later gebruik een LATERAL
doe mee:
SELECT v.col_a, v.col_b, f.* -- no parentheses here, 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;
Waarom LEFT JOIN LATERAL ... ON true
?
- Record geretourneerd door functie heeft kolommen aaneengeschakeld
Voor oudere versies , is er een heel eenvoudige manier om te bereiken wat ik denk u probeert met een set-return-functie (RETURNS TABLE
of RETURNS SETOF record
OF RETURNS record
):
SELECT *, (f_citizen_rec_modified(col1, col2)).*
FROM v_citizenversions v
De functie berekent eenmaal waarden voor elke rij van de buitenste query. Als de functie meerdere rijen retourneert, worden de resulterende rijen dienovereenkomstig vermenigvuldigd. Alle haakjes zijn syntactisch vereist om een rijtype te ontleden. De tabelfunctie zou er ongeveer zo uit kunnen zien:
CREATE OR REPLACE FUNCTION f_citizen_rec_modified(_col1 int, _col2 text)
RETURNS TABLE(col_c integer, col_d text) AS
$func$
SELECT s.col_c, s.col_d
FROM some_tbl s
WHERE s.col_a = $1
AND s.col_b = $2
$func$ LANGUAGE sql;
U moet dit in een subquery of CTE plaatsen als u een WHERE
. wilt toepassen omdat de kolommen niet op hetzelfde niveau zichtbaar zijn. (En het is sowieso beter voor de prestaties, omdat je herhaalde evaluatie voor elke uitvoerkolom van de functie voorkomt):
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;
Er zijn verschillende andere manieren om dit of iets dergelijks te doen. Het hangt allemaal af van wat je precies wilt.