En Postgres 9.3 o temprano utilizar un LATERAL
Ingreso:
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;
Por qué LEFT JOIN LATERAL ... ON true
?
Para versiones anteriores, hay una manera muy simple de lograr lo creo que está intentando con una función de puesta a punto de regresar (RETURNS TABLE
or RETURNS SETOF record
OR RETURNS record
):
SELECT *, (f_citizen_rec_modified(col1, col2)).*
FROM v_citizenversions v
La función calcula valores o nce para cada fila de la consulta externa. Si la función devuelve varias filas, las filas resultantes se multiplican en consecuencia. Todos los paréntesis se requieren sintácticamente para descomponer un tipo de fila. La función de tabla podría ser algo como esto:
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;
Necesitas terminar con esto en una subconsulta o CTE si desea aplicar una cláusula WHERE
debido a que las columnas no son visibles en el mismo nivel. (Y es mejor para el rendimiento de todos modos, porque prevenir la repetición de la evaluación para cada columna de salida de la función):
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;
Hay varias otras maneras de hacer esto o algo similar. Todo depende de lo que quieras exactamente.
No es necesario aplicar cruz en Postgres. Puede usar una función de tabla como una función. Simplemente únete a ellos. –
@a_horse_with_no_name - 'CROSS APPLY' vuelve a ejecutar el TVF con parámetros correlacionados en lugar de ejecutarlo una vez y luego unir el resultado. –