Várias opções.
Forneça parâmetros em um CTE para ter "variáveis" em SQL puro :
WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM users, var v
WHERE lastname = v.lastname; Isso funciona para qualquer query.
Desde que o CTE
var contém uma única linha é seguro anexá-lo com um CROSS JOIN no final da cláusula FROM - na verdade, a forma abreviada com anexá-la após uma vírgula pode ser melhor porque a sintaxe de junção explícita liga antes das vírgulas. O alias de tabela adicional v é opcional para encurtar ainda mais a sintaxe. OU mais barato sem CTE. BTW, por que
varchar(16) ? Basta usar text :SELECT *
FROM users
JOIN (SELECT 'Troy'::text) var(lastname) USING (lastname)
WHERE lastname = var.lastname;
Ou use uma tabela temporária desempenhar um papel semelhante para todos consultas na mesma sessão. As tabelas temporárias morrem com o final da sessão.
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);
- Sobre tabelas temporárias e
autovacuum
Ou você pode usar
DO declarações como @Houari fornecidas ou como demonstradas aqui:- O PostgreSQL faz loops fora das funções. Isso é possível?
Observe que você não pode retornar valores de
DO declarações. (Você pode usar RAISE ... embora.) E você não pode usar SELECT sem alvo em plpgsql - a linguagem procedural padrão em um DO demonstração. Substituir SELECT com PERFORM para jogar fora os resultados. Ou você pode usar opções personalizadas , que você pode definir em
postgresql.conf para ser visível globalmente . Ou definido em sua sessão para ficar visível durante a sessão e somente na mesma sessão :
SET my.lastname = 'Troy';
O nome da variável deve incluir um ponto. Você está limitado a
text como tipo de dados desta forma, mas qualquer tipo de dados pode ser representado como text ... Você pode usar
current_setting('my.lastname') como expressão de valor. Transmita se precisar. Por exemplo:current_setting('my.json_var')::json ... Ou use
SET LOCAL para que o efeito dure apenas para a transação atual . Ver:- Passando o ID do usuário para gatilhos do PostgreSQL
Ou você pode usar minúsculo
IMMUTABLE funções como global variáveis persistentes que apenas usuários privilegiados podem manipular. Ver:- Existe uma maneira de definir uma constante nomeada em uma consulta do PostgreSQL?
Ou ao trabalhar com o psql como cliente, use o
\set ou \gset meta-comandos e substituição de variáveis.