438 votes

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

Comment 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 déclarées simplement comme "nom type ;", mais cela me donne une erreur de syntaxe :

myvar INTEGER;

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

3 votes

Cela peut se faire uniquement avec PostgreSQL. Voir la réponse à cette question connexe : stackoverflow.com/questions/766657/

4 votes

Cette réponse connexe contient de meilleures réponses : stackoverflow.com/questions/13316773/

45voto

Jorge Luis Points 331

Cette solution est basée sur celle proposée par fei0x mais elle présente les avantages suivants : il n'est pas nécessaire de joindre la liste des valeurs des constantes dans la requête et les constantes peuvent être facilement listées au début de la requête. Elle fonctionne également dans les requêtes récursives.

En fait, chaque constante est un tableau à valeur unique. déclaré dans une clause WITH qui peut ensuite être appelée n'importe où dans la partie restante de la requête.

  • Exemple de base avec deux constantes :

    WITH constant_1_str AS (VALUES ('Hello World')), constant_2_int AS (VALUES (100)) SELECT * FROM some_table WHERE table_column = (table constant_1_str) LIMIT (table constant_2_int)

Vous pouvez également utiliser SELECT * FROM constant_name au lieu de TABLE constant_name qui pourrait ne pas être valable pour d'autres langages de requête différents de postgresql.

0 votes

Très soigné, je vais l'utiliser souvent. Par curiosité, à quoi sert le mot-clé TABLE dans ce contexte ? Je n'ai pas de chance de le trouver car c'est un terme générique.

0 votes

@user323094 C'est la même chose que 'select * from XX'.

1 votes

Cela ne fonctionne qu'une fois. Si vous écrivez une requête de sélection pour utiliser la même valeur deux fois, vous obtenez une erreur disant "Erreur SQL [42P01] : ERROR : la relation "constant_1_str" n'existe pas Position : 20"

27voto

Utilisation d'une table temporaire en dehors de pl/PgSQL

En dehors de l'utilisation de pl/pgsql ou d'un autre langage pl/* comme suggéré, c'est la seule autre possibilité à laquelle je pense.

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

20voto

bluish Points 5503

Je veux proposer une amélioration de La réponse de @DarioBarrionuevo pour 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;

0 votes

Belle solution pour résoudre le bloc DO qui ne peut pas retourner un ensemble de données !

0 votes

Sur PostgreSQL 11.0, une telle requête retourne 1 (vraisemblablement le nombre de lignes) plutôt que le contenu du fichier tmp_table .

16voto

Il est vrai qu'il n'y a pas de façon claire et nette de déclarer une variable à valeur unique, mais vous pouvez faire ce qui suit

with myVar as (select "any value really")

ensuite, pour avoir accès à la valeur stockée dans cette construction, vous faites

(select * from myVar)

par exemple

with var as (select 123)    
... where id = (select * from var)

0 votes

Je n'ai pu l'utiliser qu'une seule fois, la deuxième fois que j'ai essayé de l'utiliser, le message "SQL Error [42P01] : ERREUR : la relation "varName" n'existe pas Position : 143"

16voto

gavenkoa Points 6974

Vous pouvez recourir aux fonctions spéciales de l'outil. Comme pour la syntaxe propriétaire de DBeaver :

@set name = 'me'
SELECT :name;
SELECT ${name};

DELETE FROM book b
WHERE b.author_id IN (SELECT a.id FROM author AS a WHERE a.name = :name);

4 votes

Ceci est plus proche de l'utilisable : je vais regarder si DBeaver supporte les listes et les boucles : j'ai besoin d'appliquer le même sql à plusieurs schémas et la liste serait celle des schémas auxquels les appliquer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X