Postgres 9.3以降では、LATERAL
結合を使用します。
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
ですか?
古いバージョンの場合、セットを返す関数 (またはOR )を使用して、あなたがしようとしていることを達成するための非常に簡単な方法があります。RETURNS TABLE
RETURNS SETOF record
RETURNS record
SELECT *, (f_citizen_rec_modified(col1, col2)).*
FROM v_citizenversions v
この関数は、外側のクエリの行ごとに 1 回値を計算します。関数が複数の行を返す場合、結果の行はそれに応じて乗算されます。行型を分解するには、構文上すべての括弧が必要です。テーブル関数は次のようになります。
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 でラップする必要があります。(関数の出力列ごとに評価が繰り返されるのを防ぐため、とにかくパフォーマンスが向上します):
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;
これまたは同様のことを行うには、他にもいくつかの方法があります。それはすべて、あなたが正確に何を望んでいるかによって異なります。