Uit de reacties denk ik eindelijk dat ik het begrijp. U hebt dynamische SQL nodig :
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;
Houd er echter rekening mee dat deze opstelling wijd open staat voor SQL-injectie . Gebruik alleen geverifieerde invoer. Een functie werkt in PostgreSQL 8.3 ook (geen DO
verklaringen, nog niet).
U kunt niet verwijzen naar parameters in dynamische SQL (EXECUTE
uitspraak). U moet de waarde in de queryreeks invoeren.
In PostgreSQL 8.4 of later heb je de superieure grondstof van de USING
clausule
. Helaas, niet in versie 8.3. Overweeg om te upgraden als je kunt.
Ik heb een oplossing voor je oude versie gemaakt. Je moet speciaal letten op de NULL
waarde.