Từ những nhận xét cuối cùng tôi nghĩ rằng tôi đã hiểu. Bạn cần SQL động :
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;
Tuy nhiên, hãy lưu ý rằng thiết lập này mở rộng cho SQL injection . Chỉ sử dụng đầu vào đã xác minh. Một hàm hoạt động trong PostgreSQL 8.3 nữa (không DO
tuyên bố, chưa).
Bạn không thể tham chiếu đến các tham số bên trong SQL động (EXECUTE
bản tường trình). Bạn phải đặt giá trị vào chuỗi truy vấn.
Trong PostgreSQL 8.4 trở lên, bạn có USING
mệnh đề
. Than ôi, không phải trong phiên bản 8.3. Bạn nên xem xét nâng cấp nếu có thể.
Tôi đã đưa ra một giải pháp thay thế cho phiên bản cũ của bạn. Bạn phải đặc biệt chăm sóc NULL
giá trị.