Comment déclarer une variable dans une requête PostgreSQL

Comment puis-je déclarer une variable à utiliser dans une requête PostgreSQL 8.3?

Dans MS SQL Server, je peux le faire:

DECLARE @myvar INT SET @myvar = 5 SELECT * FROM somewhere WHERE something = @myvar 

Comment faire la même chose dans PostgreSQL? Selon la documentation, les variables sont simplement déclarées comme “type de nom”, mais cela me donne une erreur de syntaxe:

 myvar INTEGER; 

Quelqu’un pourrait-il me donner un exemple de la syntaxe correcte?

Il n’y a pas de telle fonctionnalité dans PostgreSQL. Vous ne pouvez le faire qu’en pl / PgSQL (ou autre pl / *), mais pas en langage SQL simple.

Une exception est la requête WITH () qui peut fonctionner comme une variable ou même un tuple de variables. Il vous permet de retourner une table de valeurs temporaires.

 WITH master_user AS ( SELECT login, registration_date FROM users WHERE ... ) SELECT * FROM users WHERE master_login = (SELECT login FROM master_user) AND (SELECT registration_date FROM master_user) > ...; 

J’ai atteint le même objective en utilisant une clause WITH , elle est loin d’être aussi élégante mais peut faire la même chose. Bien que pour cet exemple, c’est vraiment exagéré. Je ne recommande pas particulièrement cela.

 WITH myconstants (var1, var2) as ( values (5, 'foo') ) SELECT * FROM somewhere, myconstants WHERE something = var1 OR something_else = var2; 

Vous pouvez également essayer ceci dans PLPGSQL:

 DO $$ DECLARE myvar integer; BEGIN SELECT 5 INTO myvar; DROP TABLE IF EXISTS tmp_table; CREATE TABLE tmp_table AS SELECT * FROM yourtable WHERE id = myvar; END $$; SELECT * FROM tmp_table; 

Ce qui précède nécessite Postgres 9.0 ou ultérieur.

Cela dépend de votre client.

Toutefois, si vous utilisez le client psql , vous pouvez utiliser les éléments suivants:

 my_db=> \set myvar 5 my_db=> SELECT :myvar + 1 AS my_var_plus_1; my_var_plus_1 --------------- 6 

Paramètres de configuration dynamic

vous pouvez “abuser” des parameters de configuration dynamics pour ceci:

 -- choose some prefix that is unlikey to be used by postgres set session my.vars.id = '1'; select * from person where id = current_setting('my.vars.id')::int; 

Les parameters de configuration sont toujours des valeurs varchar, vous devez donc les convertir au type de données approprié lorsque vous les utilisez. Cela fonctionne avec n’importe quel client SQL alors que \set ne fonctionne que dans psql

Ce qui précède nécessite Postgres 9.2 ou ultérieur.

Pour les versions précédentes, la variable devait être déclarée dans postgresql.conf avant d’être utilisée, ce qui limitait quelque peu sa facilité d’utilisation. En fait, pas la variable complètement, mais la “classe” de configuration qui est essentiellement le préfixe. Mais une fois le préfixe défini, toute variable peut être utilisée sans modifier postgresql.conf

Utiliser une table temporaire en dehors de pl / PgSQL

En dehors de l’utilisation de pl / pgsql ou autre langage pl / * comme suggéré, c’est la seule autre possibilité à laquelle je pourrais penser.

 begin; select 5::int as var into temp table myvar; select * from somewhere s, myvar v where s.something = v.var; commit; 

Je souhaite proposer une amélioration à la réponse de @DarioBarrionuevo , afin de simplifier l’utilisation des tables temporaires.

 DO $$ DECLARE myvar integer = 5; BEGIN CREATE TEMP TABLE tmp_table ON COMMIT DROP AS -- put here your query with variables: SELECT * FROM yourtable WHERE id = myvar; END $$; SELECT * FROM tmp_table; 

Voici un exemple d’utilisation d’ instructions PREPARE . Vous ne pouvez toujours pas utiliser ? , mais vous pouvez utiliser la notation $n :

 PREPARE foo(integer) AS SELECT * FROM somewhere WHERE something = $1; EXECUTE foo(5); DEALLOCATE foo;