Diverses options.
Fournissez des paramètres dans un CTE pour avoir des "variables" en SQL pur :
WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM users, var v
WHERE lastname = v.lastname;
Cela fonctionne pour tous requête.
Depuis le CTE var
contient une seule ligne il est sûr de l'ajouter avec un CROSS JOIN
à la fin de la clause FROM - en fait, la forme courte avec l'ajout après une virgule peut être préférable car la syntaxe de jointure explicite se lie avant les virgules. L'alias de table supplémentaire v
est facultatif pour raccourcir davantage la syntaxe.
OU moins cher sans CTE. BTW, pourquoi varchar(16)
? Utilisez simplement text
:
SELECT *
FROM users
JOIN (SELECT 'Troy'::text) var(lastname) USING (lastname)
WHERE lastname = var.lastname;
Ou utiliser une table temporaire jouer un rôle similaire pour tous requêtes au sein d'une même session. Les tables temporaires meurent à la fin de la session.
CREATE TEMP TABLE var AS
SELECT text 'Troy' AS lastname;
ANALYZE var; -- temp tables are not covered by autovacuum
SELECT * FROM users JOIN var USING (lastname);
- À propos des tables temporaires et
autovacuum
Ou vous pouvez utiliser DO
des déclarations comme @Houari fourni ou comme démontré ici :
- PostgreSQL boucle en dehors des fonctions. Est-ce possible ?
Notez que vous ne pouvez pas renvoyer les valeurs de DO
déclarations. (Vous pouvez utiliser RAISE ...
cependant.) Et vous ne pouvez pas utiliser SELECT
sans cible dans plpgsql - le langage procédural par défaut dans un DO
déclaration. Remplacez SELECT
avec PERFORM
jeter les résultats.
Ou vous pouvez utiliser des options personnalisées , que vous pouvez définir dans postgresql.conf
être visible à l'échelle mondiale .
Ou défini dans votre session pour être visible pendant la durée de la session et uniquement dans la même session :
SET my.lastname = 'Troy';
Le nom de la variable doit inclure un point. Vous êtes limité au text
comme type de données de cette façon, mais n'importe quel type de données peut être représenté comme text
...
Vous pouvez utiliser current_setting('my.lastname')
comme expression de valeur. Diffusez si vous en avez besoin. Par exemple :current_setting('my.json_var')::json
...
Ou utilisez SET LOCAL
pour que l'effet ne dure que pour la transaction en cours . Voir :
- Transmettre l'ID utilisateur aux déclencheurs PostgreSQL
Ou vous pouvez utiliser de minuscules IMMUTABLE
fonctions comme mondial variables persistantes que seuls les utilisateurs privilégiés peuvent manipuler. Voir :
- Existe-t-il un moyen de définir une constante nommée dans une requête PostgreSQL ?
Ou lorsque vous travaillez avec psql en tant que client, utilisez le \set
ou \gset
méta-commandes et substitution de variables.