PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

if-statement com string contendo a condição


Pelos comentários, finalmente acho que entendi. Você precisa de SQL dinâmico :
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;

Esteja ciente, no entanto, que esta configuração está aberta para injeção de SQL . Use somente entrada verificada. Uma função funciona no PostgreSQL 8.3 também (sem DO declarações, ainda).

Você não pode fazer referência a parâmetros dentro do SQL dinâmico (EXECUTE declaração). Você tem que colocar o valor na string de consulta.

No PostgreSQL 8.4 ou posterior você tem a mercadoria superior do USING cláusula . Infelizmente, não na versão 8.3. Você deve considerar a atualização, se puder.

Eu coloquei uma solução alternativa para sua versão antiga. Você tem que tomar cuidado especial com o NULL valor.