PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como testar meu SQL ad-hoc com parâmetros na janela de consulta do Postgres


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.