如何在PostgreSQL查询中声明一个variables

如何在PostgreSQL 8.3查询中声明一个variables?

在MS SQL Server中,我可以这样做:

DECLARE @myvar INT SET @myvar = 5 SELECT * FROM somewhere WHERE something = @myvar 

我如何在PostgreSQL中做同样的事情? 根据文档variables被简单地声明为“名称types”,但这给了我一个语法错误:

 myvar INTEGER; 

有人能给我一个正确的语法的例子吗?

PostgreSQL中没有这样的function。 您只能在pl / PgSQL(或其他pl / *)中执行,而不能在普通的SQL中执行。

我通过使用WITH子句完成了相同的目标,它远没有优雅,但可以做同样的事情。 虽然对于这个例子来说,这确实是过度的。 我也不特别推荐这个。

 WITH myconstants as (SELECT '5'::text as myvar FROM anywhere_unimportant) SELECT * FROM somewhere WHERE something IN (SELECT myvar FROM myconstants) 

你也可以在PLPGSQL中试试这个:

 DO $$ DECLARE myvar integer; BEGIN SELECT 5 INTO myvar; DROP TABLE IF EXISTS tmp_table; CREATE TABLE tmp_table AS SELECT * FROM yourtable WHERE id = myvar; END $$; SELECT * FROM tmp_table; 

以上要求Postgres 9.0或更高版本。

这取决于你的客户。

但是,如果您使用的是psql客户端,那么您可以使用以下内容:

 my_db=> \set myvar 5 my_db=> SELECT :myvar + 1 AS my_var_plus_1; my_var_plus_1 --------------- 6 

dynamicconfiguration设置

你可以“滥用”这个dynamicconfiguration设置:

 -- choose some prefix that is unlikey to be used by postgres set session my.vars.id = '1'; select * from person where id = current_setting('my.vars.id')::int; 

configuration设置始终是varchar值,因此在使用它们时需要将它们转换为正确的数据types。 这适用于任何SQL客户端,而\set只能在psql

以上要求Postgres 9.2或更高版本。

对于以前的版本,variables必须在使用之前在postgresql.conf声明,所以它在一定程度上限制了它的可用性。 实际上不是完全variables,而是configuration“类”,它实质上是前缀。 但是一旦定义了前缀,就可以使用任何variables而不改变postgresql.conf

使用pl / PgSQL之外的临时表

除了使用pl / pgsql或其他pl / *语言build议之外,这是我能想到的唯一的其他可能性。

 begin; select 5::int as var into temp table myvar; select * from somewhere s, myvar v where s.something = v.var; commit; 

我想提出一个改进@ DarioBarrionuevo的答案 ,使之更简单地利用临时表。

 DO $$ DECLARE myvar integer = 5; BEGIN CREATE TEMP TABLE tmp_table ON COMMIT DROP AS -- put here your query with variables: SELECT * FROM yourtable WHERE id = myvar; END $$; SELECT * FROM tmp_table;