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 "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?
Réponses:
Il n'y a pas une telle fonctionnalité dans PostgreSQL. Vous ne pouvez le faire qu'en pl / PgSQL (ou autre pl / *), mais pas en SQL simple.
Une exception est la
WITH ()
requête qui peut fonctionner comme une variable, ou même commetuple
des variables. Il vous permet de renvoyer un tableau de valeurs temporaires.la source
J'ai atteint le même objectif en utilisant une
WITH
clause , elle est loin d'être aussi élégante mais peut faire la même chose. Mais pour cet exemple, c'est vraiment exagéré. Je ne le recommande pas non plus particulièrement.la source
\set
comme suggéré dans la réponse de Shahriar Aghajani.JOIN myconstants ON true
et puis il n'y a pas besoin de faire la sous-sélection.WITH
CTE entre les requêtes d'une transaction.WITH constants AS (SELECT 5 AS var) SELECT * FROM somewhere CROSS JOIN constants WHERE someting=var;
. CROSS JOIN, étant un avec une expression de table à une seule ligne, duplique virtuellement les données de toutes les lignes de la vraie table et simplifie l'expression.Vous pouvez également essayer ceci dans PLPGSQL:
Ce qui précède nécessite Postgres 9.0 ou version ultérieure.
la source
Paramètres de configuration dynamique
vous pouvez "abuser" des paramètres de configuration dynamique pour cela:
Les paramètres de configuration sont toujours des valeurs varchar, vous devez donc les caster dans le type de données correct lorsque vous les utilisez. Cela fonctionne avec n'importe quel client SQL alors
\set
quepsql
Ce qui précède nécessite Postgres 9.2 ou version ultérieure.
Pour les versions précédentes, la variable devait être déclarée
postgresql.conf
avant d'être utilisée, ce qui limitait quelque peu son utilisation. En fait pas complètement la variable, 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 changerpostgresql.conf
la source
set session my.vars.id = '1';
pourset session my.user.id = '1';
donnerERROR: syntax error at or near "user"
SET LOCAL ...
. Lasession
variable restera en vigueur tant que votre connexion l'est. Lelocal
est limité à la transaction.set session "my.user.id" = '1';
L'current_setting('my.user.id')
appel fonctionne comme prévu.Cela dépend de votre client.
Cependant, si vous utilisez le client psql , vous pouvez utiliser les éléments suivants:
Si vous utilisez des variables de texte, vous devez citer.
la source
\set
doit être en minusculesdb=> \set someid 8292 db=> SELECT * FROM sometable WHERE id = :someid;
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 pourrais penser.
la source
Je veux proposer une amélioration à la réponse de @ DarioBarrionuevo , pour la rendre plus simple en utilisant des tables temporaires.
la source
1
(vraisemblablement le nombre de lignes) plutôt que le contenu detmp_table
.Cette solution est basée sur celle proposée par fei0x mais elle présente l'avantage de ne pas avoir besoin de joindre la liste de valeurs des constantes dans la requête et les constantes peuvent être facilement listées au début de la requête. Il fonctionne également dans les requêtes récursives.
Fondamentalement, chaque constante est une table à valeur unique déclarée dans une clause WITH qui peut ensuite être appelée n'importe où dans la partie restante de la requête.
Vous pouvez également utiliser
SELECT * FROM constant_name
au lieu de celuiTABLE constant_name
qui pourrait ne pas être valide pour d'autres langages de requête différents de postgresql.la source
Voici un exemple utilisant des instructions PREPARE . Vous ne pouvez toujours pas utiliser
?
, mais vous pouvez utiliser la$n
notation:la source
Certes, il n'y a pas de façon claire et non ambiguë de déclarer une variable à valeur unique, ce que vous pouvez faire est
puis, pour accéder à la valeur stockée dans cette construction, vous devez
par exemple
la source
Vous pouvez recourir à des fonctionnalités spéciales de l'outil. Comme pour la propre syntaxe propriétaire de DBeaver:
la source
Dans DBeaver, vous pouvez utiliser les paramètres dans les requêtes comme vous le pouvez à partir du code, donc cela fonctionnera:
Lorsque vous exécutez la requête, DBeaver vous demandera la valeur de: myvar et exécutera la requête.
la source