, Sana bir set dönen fonksiyonu (RETURNS TABLE
or RETURNS SETOF record
OR RETURNS record
) ile çalışıyoruz düşüncelerinizi gerçekleştirmek için çok basit bir yolu var:
SELECT *, (f_citizen_rec_modified(col1, col2)).*
FROM v_citizenversions v
İşlev, o dış sorgu her satır için nce. Fonksiyon birden çok satır döndürürse, sonuçta oluşan satırlar buna göre çarpılır. Tüm parantezleri, bir satır türünün ayrıştırılması için sözdizimsel olarak gereklidir. masa işlevi şöyle görünebilir: Eğer sütunlar aynı seviyede görünmez çünkü WHERE
maddesini uygulamak istiyorsanız
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;
Bir alt sorgu veya CTE sar gerekir. (Eğer fonksiyonun her çıkış sütunu için değerlendirme tekrar önlemek çünkü o, zaten performans için daha iyi): Bu veya benzeri bir şey yapmak için birkaç başka yolları da vardır
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;
. Her şey tam olarak ne istediğine bağlı.
SELECT *, (f_citizen_rec_modified(col1, col2)).*
FROM v_citizenversions v
çalıştırırken f_citizen_rec_modified fonksiyonu (v_citizenversions her satırda ile çarpılır) döndürür her kolon için 1 defa ran edilecektir :
: iç YANAL
INNER JOIN LATERAL
CROSS APPLY
ve
LEFT JOIN LATERAL
aynı aynıOUTER APPLY
olarak Örnek kullanım olduğunu JOIN. Bir işlev işlevini tıpkı bir işlev gibi kullanabilirsiniz. Sadece onlara katıl. –@a_horse_with_no_name - "CROSS APPLY", TVF'yi bir kez yürütmek yerine ve daha sonra sonuca katılmak yerine ilişkilendirilmiş parametrelerle yeniden çalıştırır. –