Dari komentar saya akhirnya berpikir saya mengerti. Anda memerlukan SQL dinamis :
CREATE OR REPLACE FUNCTION foo(lastcontact timestamptz)
RETURNS void AS
$func$
DECLARE
myrec record;
mycond boolean;
BEGIN
FOR myrec IN
SELECT * FROM tabel ORDER BY colorlevel, volgnummer
LOOP
IF myrec.conditie ~~ '%lastcontact %' THEN -- special case for input param
myrec.conditie := replace (myrec.conditie
, 'lastcontact '
, CASE WHEN lastcontact IS NULL THEN 'NULL '
ELSE '''' || lastcontact::text || ''' ' END);
END IF;
EXECUTE 'SELECT ' || myrec.conditie || ' FROM tabel' INTO mycond;
IF mycond then
RAISE NOTICE 'Condition % is true', myrec.conditie;
ELSE
RAISE NOTICE 'Condition % is false', COALESCE(myrec.conditie, 'NULL');
END IF;
END LOOP;
END
$func$ LANGUAGE plpgsql;
Namun, perlu diketahui bahwa penyiapan ini terbuka lebar untuk injeksi SQL . Hanya gunakan input terverifikasi. Fungsi berfungsi di PostgreSQL 8.3 juga (tidak ada DO
pernyataan, belum).
Anda tidak dapat merujuk ke parameter di dalam SQL dinamis (EXECUTE
penyataan). Anda harus memasukkan nilai ke dalam string kueri.
Di PostgreSQL 8.4 atau yang lebih baru, Anda memiliki komoditas unggulan USING
klausa
. Sayangnya, tidak di versi 8.3. Anda harus mempertimbangkan untuk meningkatkan versi jika Anda bisa.
Saya memberikan solusi untuk versi lama Anda. Anda harus berhati-hati dengan NULL
nilai.