W Postgresie 9.3 lub później użyj LATERAL
dołącz:
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;
Dlaczego LEFT JOIN LATERAL ... ON true
?
- Rekord zwrócony z funkcji zawiera połączone kolumny
Dla starszych wersji , jest bardzo prosty sposób na osiągnięcie tego, co myślę próbujesz z funkcją zwracającą zestaw (RETURNS TABLE
lub RETURNS SETOF record
LUB RETURNS record
):
SELECT *, (f_citizen_rec_modified(col1, col2)).*
FROM v_citizenversions v
Funkcja oblicza wartości raz dla każdego wiersza zapytania zewnętrznego. Jeśli funkcja zwraca wiele wierszy, wynikowe wiersze są odpowiednio mnożone. Wszystkie nawiasy są wymagane składni rozłożyć typ wiersza. Funkcja tabeli może wyglądać mniej więcej tak:
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;
Musisz umieścić to w podzapytaniu lub CTE, jeśli chcesz zastosować WHERE
klauzula, ponieważ kolumny nie są widoczne na tym samym poziomie. (I tak jest to lepsze dla wydajności, ponieważ zapobiegasz powtarzaniu oceny dla każdej kolumny wyjściowej funkcji):
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;
Istnieje kilka innych sposobów na zrobienie tego lub czegoś podobnego. Wszystko zależy od tego, czego dokładnie chcesz.