Toutes les expressions utilisées dans les instructions PL/pgSQL sont traitées par l'exécuteur SQL classique du serveur. En effet, une requête comme
SELECT expression
   
   est traité par le moteur SQL principal. Bien qu'utilisant la commande
   SELECT, tout nom de variable
   PL/pgSQL est remplacé par les paramètres
   de la requête
   (ceci est expliqué en détail dans la Section 43.11.1).
   Cela permet au plan de requête du SELECT d'être
   préparé une seule fois, puis d'être réutilisé pour les évaluations
   suivantes avec différentes valeurs des variables. Du coup, ce qui arrive
   réellement à la première utilisation d'une expression est simplement
   une commande PREPARE. Par exemple, si nous déclarons
   deux variables de type integer, x et
   y, et que nous écrivons :
   
IF x < y THEN ...
ce qui se passe en arrière plan est équivalent à :
PREPARE nom_instruction(integer, integer) AS SELECT $1 < $2;
   
   puis cette instruction préparée est exécutée (via EXECUTE)
   pour chaque exécution de l'instruction IF, avec les
   valeurs actuelles des variables PL/pgSQL fournies
   en tant que valeurs des paramètres. Généralement, ces détails
   ne sont pas importants pour un utilisateur de
   PL/pgSQL, mais ils sont utiles à connaître
   pour diagnostiquer un problème.
   Vous trouverez plus d'informations dans Section 43.11.2.
  
   Comme une expression est convertie en une
   commande SELECT, elle peut contenir les mêmes clauses
   qu'un SELECT ordinaire, sauf qu'elle ne peut pas
   inclure une clause UNION, INTERSECT
   ou EXCEPT dans la requête principale. Donc, par
   exemple, vous pourriez tester si une table est remplie avec 
   
IF count(*) > 0 FROM my_table THEN ...
   parce que l'expression entre
   IF et THEN est analysé comme si
   c'était SELECT count(*) > 0 FROM my_table. Le
   SELECT doit produire une seule colonne, et pas plus
   d'une.(S'il ne produit aucune ligne, le résultat est considéré comme
   NULL.)