PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 15BETA2 » Programmation serveur » PL/pgSQL -- Langage de procédures SQL » Expressions

43.4. Expressions

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.)