Di Postgres 9.3 atau yang lebih baru gunakan LATERAL
bergabung:
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;
Mengapa LEFT JOIN LATERAL ... ON true
?
- Data yang dikembalikan dari fungsi memiliki kolom yang digabungkan
Untuk versi lama , ada cara yang sangat sederhana untuk mencapai apa yang Menurut saya yang Anda coba dengan fungsi pengembalian set (RETURNS TABLE
atau RETURNS SETOF record
ATAU RETURNS record
):
SELECT *, (f_citizen_rec_modified(col1, col2)).*
FROM v_citizenversions v
Fungsi menghitung nilai sekali untuk setiap baris kueri luar. Jika fungsi mengembalikan beberapa baris, baris yang dihasilkan akan dikalikan. Semua kurung secara sintaksis diperlukan untuk menguraikan jenis baris. Fungsi tabel bisa terlihat seperti ini:
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;
Anda perlu membungkus ini dalam subquery atau CTE jika Anda ingin menerapkan WHERE
klausa karena kolom tidak terlihat pada tingkat yang sama. (Dan itu lebih baik untuk kinerja, karena Anda mencegah evaluasi berulang untuk setiap kolom keluaran fungsi):
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;
Ada beberapa cara lain untuk melakukan ini atau yang serupa. Itu semua tergantung pada apa yang Anda inginkan.