我如何在PostgreSQL 8.3查询中声明一个变量?

在MS SQL Server我可以这样做:

DECLARE @myvar INT
SET @myvar = 5

SELECT *
FROM somewhere
WHERE something = @myvar

我如何在PostgreSQL做同样的事情?根据文档,变量被简单地声明为“name type;”,但这给了我一个语法错误:

myvar INTEGER;

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


当前回答

我通过使用WITH子句实现了同样的目标,它远没有那么优雅,但可以做同样的事情。虽然对于这个例子来说,它真的是太夸张了。我也不特别推荐这个。

WITH myconstants (var1, var2) as (
   values (5, 'foo')
)
SELECT *
FROM somewhere, myconstants
WHERE something = var1
   OR something_else = var2;

其他回答

这取决于你的客户。

然而,如果你正在使用psql客户端,那么你可以使用以下方法:

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

如果你使用文本变量,你需要引用。

\set myvar 'sometextvalue'
select * from sometable where name = :'myvar';

此解决方案基于fei0x提出的解决方案,但它的优点是不需要在查询中加入常量的值列表,并且可以在查询开始时轻松列出常量。它也适用于递归查询。

基本上,每个常量都是在WITH子句中声明的单值表,然后可以在查询的其余部分的任何地方调用它。

包含两个常量的基本示例:

WITH
    constant_1_str AS (VALUES ('Hello World')),
    constant_2_int AS (VALUES (100))
SELECT *
FROM some_table
WHERE table_column = (table constant_1_str)
LIMIT (table constant_2_int)

或者,你可以使用SELECT * FROM constant_name代替TABLE constant_name,这对于与postgresql不同的其他查询语言可能无效。

下面是一个使用PREPARE语句的例子。你仍然不能使用?,但你可以使用$n符号:

PREPARE foo(integer) AS
    SELECT  *
    FROM    somewhere
    WHERE   something = $1;
EXECUTE foo(5);
DEALLOCATE foo;

我通过使用WITH子句实现了同样的目标,它远没有那么优雅,但可以做同样的事情。虽然对于这个例子来说,它真的是太夸张了。我也不特别推荐这个。

WITH myconstants (var1, var2) as (
   values (5, 'foo')
)
SELECT *
FROM somewhere, myconstants
WHERE something = var1
   OR something_else = var2;

的确,没有明确的方式来声明单值变量,你能做的是

with myVar as (select "any value really")

然后,要访问存储在这个结构中的值,就必须这样做

(select * from myVar)

例如

with var as (select 123)    
... where id = (select * from var)