PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

if-Anweisung mit String, der die Bedingung enthält

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.