Von den Kommentaren denke ich endlich, dass ich es verstehe. Sie benötigen dynamisches SQL :
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;
Beachten Sie jedoch, dass dieses Setup für SQL-Injection weit offen ist . Verwenden Sie nur verifizierte Eingaben. Eine Funktion funktioniert in PostgreSQL 8.3 auch (kein DO
Aussagen, noch).
Sie können innerhalb von dynamischem SQL nicht auf Parameter verweisen (EXECUTE
Aussage). Sie müssen den Wert in die Abfragezeichenfolge einfügen.
In PostgreSQL 8.4 oder höher haben Sie das überlegene Produkt des USING
Klausel
. Leider nicht in Version 8.3. Sie sollten ein Upgrade in Betracht ziehen, wenn Sie können.
Ich habe einen Workaround für Ihre alte Version eingebaut. Auf NULL
müssen Sie besonders achten Wert.