Como declaro uma variável para uso em uma consulta do PostgreSQL 8.3?
No MS SQL Server, eu posso fazer isso:
DECLARE @myvar INT
SET @myvar = 5
SELECT *
FROM somewhere
WHERE something = @myvar
Como faço o mesmo no PostgreSQL? De acordo com a documentação, as variáveis são declaradas simplesmente como "name type;", mas isso gera um erro de sintaxe:
myvar INTEGER;
Alguém poderia me dar um exemplo da sintaxe correta?
Respostas:
Não existe esse recurso no PostgreSQL. Você pode fazer isso apenas em pl / PgSQL (ou outro pl / *), mas não em SQL simples.
Uma exceção é a
WITH ()
consulta que pode funcionar como uma variável ou mesmotuple
de variáveis. Permite retornar uma tabela de valores temporários.fonte
Eu alcancei o mesmo objetivo usando uma
WITH
cláusula , não é nem de longe tão elegante, mas pode fazer a mesma coisa. Embora para este exemplo seja realmente um exagero. Eu também particularmente não recomendo isso.fonte
\set
como sugerido na resposta de Shahriar Aghajani.JOIN myconstants ON true
e então não há necessidade de fazer a sub-seleção.WITH
CTE entre as consultas de uma transação.WITH constants AS (SELECT 5 AS var) SELECT * FROM somewhere CROSS JOIN constants WHERE someting=var;
. O CROSS JOIN, sendo um com uma expressão de tabela de linha única, praticamente duplica os dados de todas as linhas da tabela real e simplifica a expressão.Você também pode tentar isso no PLPGSQL:
O acima requer Postgres 9.0 ou posterior.
fonte
Definições de configuração dinâmica
você pode "abusar" das configurações dinâmicas da configuração para isso:
As definições de configuração são sempre valores varchar, portanto, você precisa convertê-las no tipo de dados correto ao usá-las. Isso funciona com qualquer cliente SQL, enquanto
\set
só funciona empsql
O acima requer Postgres 9.2 ou posterior.
Para versões anteriores, a variável tinha que ser declarada
postgresql.conf
antes de ser usada, limitando um pouco a sua usabilidade. Na verdade, não a variável completamente, mas a "classe" de configuração, que é essencialmente o prefixo. Porém, uma vez definido o prefixo, qualquer variável pode ser usada sem alterarpostgresql.conf
fonte
set session my.vars.id = '1';
aset session my.user.id = '1';
produziráERROR: syntax error at or near "user"
SET LOCAL ...
. Asession
variável entrará em vigor enquanto você estiver conectado. Olocal
escopo é a transação.set session "my.user.id" = '1';
acurrent_setting('my.user.id')
chamada funciona conforme o esperado.Depende do seu cliente.
No entanto, se você estiver usando o cliente psql , poderá usar o seguinte:
Se você estiver usando variáveis de texto, precisará citar.
fonte
\set
deve ser minúsculodb=> \set someid 8292 db=> SELECT * FROM sometable WHERE id = :someid;
Usando uma tabela temporária fora do pl / PgSQL
Fora o uso de pl / pgsql ou outra linguagem pl / *, conforme sugerido, esta é a única outra possibilidade em que eu poderia pensar.
fonte
Quero propor uma melhoria na resposta de @ DarioBarrionuevo , para simplificar o aproveitamento de tabelas temporárias.
fonte
1
(presumivelmente a contagem de linhas) em vez do conteúdo detmp_table
.Essa solução é baseada na proposta por fei0x, mas possui as vantagens de que não há necessidade de associar a lista de valores de constantes na consulta e as constantes podem ser facilmente listadas no início da consulta. Também funciona em consultas recursivas.
Basicamente, toda constante é uma tabela de valor único declarada em uma cláusula WITH que pode ser chamada em qualquer lugar da parte restante da consulta.
Como alternativa, você pode usar em
SELECT * FROM constant_name
vez doTABLE constant_name
que pode não ser válido para outras linguagens de consulta diferentes do postgresql.fonte
Aqui está um exemplo usando instruções PREPARE . Você ainda não pode usar
?
, mas pode usar a$n
notação:fonte
É verdade que não há uma maneira clara e inequívoca de declarar uma variável de valor único, o que você pode fazer é
então, para obter acesso ao valor armazenado nesta construção, faça
por exemplo
fonte
Você pode recorrer a recursos especiais da ferramenta. Como na sintaxe proprietária do DBeaver:
fonte
No DBeaver, você pode usar parâmetros em consultas, assim como no código, portanto, isso funcionará:
Quando você executa a consulta, o DBeaver solicita o valor para: myvar e executa a consulta.
fonte