PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

instruction if avec chaîne contenant la condition

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.