D'après les commentaires, je pense enfin avoir compris. Vous avez besoin de SQL dynamique :
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;
Sachez cependant que cette configuration est largement ouverte pour l'injection SQL . N'utilisez que des entrées vérifiées. Une fonction fonctionne dans PostgreSQL 8.3 aussi (pas de DO
déclarations, encore).
Vous ne pouvez pas faire référence à des paramètres dans SQL dynamique (EXECUTE
déclaration). Vous devez mettre la valeur dans la chaîne de requête.
Dans PostgreSQL 8.4 ou version ultérieure, vous disposez de la commodité supérieure du USING
clause
. Hélas, pas dans la version 8.3. Vous devriez envisager une mise à niveau si vous le pouvez.
J'ai mis en place une solution de contournement pour votre ancienne version. Vous devez faire particulièrement attention au NULL
valeur.