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

Comment tester mon SQL ad hoc avec des paramètres dans la fenêtre de requête Postgres

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.