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.