Expressions de valeur

Les expressions de valeur sont utilisées dans des contextes différents, comme dans une liste cible d'une commande SELECT, ou de nouvelles valeurs de colonnes dans un INSERT ou un UPDATE, ou des conditions de recherche dans des commandes. Le résultat d'une expression de valeur est quelque fois appelé une scalar, pour la distinguer du résultat d'une expression de table (laquelle est une table). Les expressions de valeur sont donc appelées scalar expressions (ou même simplement expressions). La syntaxe des expressions admet le calcul de valeurs d'une primitive des opérations arithmétiques, logiques, ensemblistes ou autres.

Une expression de valeur est indiquée comme :

En plus de cette liste, il y a un grand nombre de constructions qui peuvent être classées comme expression mais ne suivent pas les règles générales de syntaxe. Elles possèdent généralement la sémantique d'une fonction ou d'un opérateur et sont expliquées dans the chapter called Fonctions et Opérateurs. Comme exemple la clause IS NULL.

Nous avons déjà vu les constantes dans the section called Constantes. Les sections suivantes détaillent les oprions restantes.

Références de colonne

une colonne peut être référencée par la forme :

correlation.columnname `['subscript`]'
correlation est soit le nom d'une table une alias pour une table défini par la clause FROM, soit les mots-clé NEW ou OLD. (NEW et OLD ne peuvent apparaître que dans la partie action d'une règle, tandis que les noms de corrélation peuvent être utilisés dans n'importe quel état SQL.) Les noms de corrélation et les points de séparation peuvent être omis si le nom de colonne est unique dans toutes les tables utilisées dans la requête. Si column est de type tableau, alors le sous-script optionnel sélectionne un élément spécifique ou des éléments dans le tableau. Si aucun sous-script n'est fourni, alors le tableau entier est sélectionné. (Voir the chapter called Tableaux pour plus de détails sur les tableaux).

Paramètres de position

Un paramètre de position est utilisé pour indiquer un paramètre dans une fonction SQL. Typiquement il est utilisé dans les définitions de fonction SQL. La forme du paramètre est :

$number

par exemple, considérez la définition d'une fonction, dept, comme

CREATE FUNCTION dept (text) RETURNS dept
  AS 'SELECT * FROM dept WHERE name = $1'
  LANGUAGE SQL;
Ici le $1 sera remplacé par le premier argument de fonction quand celle-ci est invoquée.

Opérateurs d'invocation

Il existe trois syntaxes possibles pour un opérateur d'invocation :

expression operator expression (opérateur binaire inséré)
operator expression (opérateur unaire préfixé)
expression operator (opérateur unaire postfixé)

où l'instruction operator suit les règles de syntaxe de the section called Operateurs ou est une des instructions AND, OR, et NOT. Quels opérateurs existent et sont-ils unaires ou binaires dépend des opérateurs définis par le système ou l'utilisateur. the chapter called Fonctions et Opérateurs décrit les opérateurs natifs.

Appels fonction

La syntaxe d'un appel fonction est le nom d'une fonction (laquelle est sujette aux règles de syntaxe des identifiants de the section called Identifiants et mots-clé), suivi par sa liste d'arguments entre parenthèses :

function ([expression [, expression ... ]] )

Par exemple celle-ci calcule la racine carrée de 2 :

sqrt(2)

La liste des fonctions natives se trouve dans the chapter called Fonctions et Opérateurs. D'autres fonctions peuvent être ajoutées par l'utilisateur.

Expressions d'agrégation

Une expression d'agrégation représente l'application d'une fonction d'agrégation dans les lignes sélectionnées par une requête. Une fonction d'agrégation réduit les entrées multiples à une seule valeur de sortie, comme la somme ou la moyenne des entrées. La syntaxe d'une expression d'agrégation se présente comme suit :

aggregate_name (expression)
aggregate_name (ALL expression)
aggregate_name (DISTINCT expression)
aggregate_name ( * )

aggregate_name est un agrégat défini précédemment, et expression est n'importe quelle valeur d'expression qui ne contient pas elle-même une expression d'agrégation.

La première forme d'une expression d'agrégation invoque l'agrégat à travers toutes les entrées lignes pour lesquelles l'expression donnée produit une valeur non NULL. (Actuellement la fonction agrégat soit ignore les NULL ou non --- mais tous les standards le font.) La seconde forme est identique à la première, depuis que ALL est la valeur par défaut. La troisième forme invoque l'agrégat pour toutes les valeurs non NULL distinctes de l'expression trouvée dans les entrées ligne. La dernière forme invoque l'agrégat une seule fois pour chaque entrée ligne en fonction des valeurs NULL ou non NULL; aucune valeur d'entrée particulière n'est spécifiée, c'est généralement seulement utile la fonction agrégat count().

Par exemple, count(*) produit le nombre total des entrées ligne; count(f1) produit le nombre des entrées lignes dans lesquelles f1 est non NULL; count(distinct f1) produit le nombre des valeurs non NULL distinctes de f1.

Les fonctions d'agrégations pré définies sont décrites dans the section called Fonctions d'agrégation in the chapter called Fonctions et Opérateurs. D'autres fonctions d'agrégation peuvent être définies par l'utilisateur.

Coercition de type

Une coercition de type spécifie une conversion depuis un type de donnée vars un autre. PostgreSQL accèpte deux syntaxes équivalentes pour les coercitions de type :

CAST ( expression AS type )
expression::type
La syntaxe CAST est conforme au SQL92; la syntaxe avec :: est d'une utilisation historique dans PostgreSQL.

Quand une coercition est appliquée à une expression de valeur d'un type connu, elle représente une conversion de type délai d'exécution. Le forçage sera accepté si une fonction conversion de type appropriée est disponible. Notez que c'est subtilement différent de l'utilisation des forçages avec des constantes, comme indiqué dans the section called Constantes d'autres types. Une forçage appliqué à une chaîne naturelle représente l'affectation initiale d'un type à une valeur de constante littérale, ainsi elle sera acceptée pour n'importe quel type (si le contenu d'une chaîne littérale possède une syntaxe correcte au niveau des entrées pour le type de donnée).

Une forçage de type explicite peut être omis s'il n'y a pas d'ambiguïté dans le type qu'une expression de valeur doit produire (par exemple, quand elle est assignée à une colonne de table); le système appliquera automatiquement un forçage de type dans ces cas là.

Il est possible de spécifier un forçage de type en utilisant une syntaxe de type fonction.

typename ( expression )
Cependant, ça fonctionne seulement pour les types dont les noms sont aussi valides comme noms de fonction. Par exemple, double precision ne peut être utilisé de cette façon, mais l'équivalent float8 le peut. Aussi, les noms interval, time, et timestamp ne peuvent être utilisés de cette façon que s'ils sont entre guillemets, à cause des conflits avec l'analyseur. Donc, l'usage de la syntaxe du forçage de type fonction conduit à des inconsistances et sera probablement supprimée dans les nouvelles versions.

Sous requêtes modulables

Une sous requête modulable est un SELECT ordinaire entre parenthèses qui renvoie exactement une ligne avec une colonne. La requête SELECT est exécutée et la valeur en retour est utilisée dans l'expression de valeur ambiante. C'est une erreur d'utiliser une requête qui renvoie plus d'une ligne ou plus d'une colonne comme une sous requête modulable. (Mais si, durant une exécution particulière, la sous requête ne renvoie pas de lignes, il n'y a pas d'erreur; le résultat est pris comme non NULL). La sous requête peut se référer aux variables de la requête ambiante, qui agira comme constante pendant n'importe quelle évaluation de la sous requête. Voir aussi the section called Expressions sous requêtes in the chapter called Fonctions et Opérateurs.

Par exemple, la suivante retrouve les villes les plus peuplées dans chaque état :

SELECT name, (SELECT max(pop) FROM cities WHERE cities.state = states.name)
FROM states;