PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

istruzione if con stringa contenente la condizione

Dai commenti penso finalmente di aver capito. Hai bisogno di SQL dinamico :

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;

Tieni presente, tuttavia, che questa configurazione è completamente aperta per SQL injection . Usa solo input verificato. Una funzione funziona in PostgreSQL 8.3 anche (nessun DO dichiarazioni, ancora).

Non puoi fare riferimento a parametri all'interno di SQL dinamico (EXECUTE dichiarazione). Devi inserire il valore nella stringa di query.

In PostgreSQL 8.4 o versioni successive hai la comodità superiore di USING clausola . Purtroppo, non nella versione 8.3. Dovresti considerare l'aggiornamento se puoi.

Ho inserito una soluzione alternativa per la tua vecchia versione. Devi prestare particolare attenzione al NULL valore.