我如何在PostgreSQL 8.3查询中声明一个变量?
在MS SQL Server我可以这样做:
DECLARE @myvar INT
SET @myvar = 5
SELECT *
FROM somewhere
WHERE something = @myvar
我如何在PostgreSQL做同样的事情?根据文档,变量被简单地声明为“name type;”,但这给了我一个语法错误:
myvar INTEGER;
谁能给我一个正确语法的例子吗?
我如何在PostgreSQL 8.3查询中声明一个变量?
在MS SQL Server我可以这样做:
DECLARE @myvar INT
SET @myvar = 5
SELECT *
FROM somewhere
WHERE something = @myvar
我如何在PostgreSQL做同样的事情?根据文档,变量被简单地声明为“name type;”,但这给了我一个语法错误:
myvar INTEGER;
谁能给我一个正确语法的例子吗?
当前回答
你也可以在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或更高版本。
其他回答
我通过使用WITH子句实现了同样的目标,它远没有那么优雅,但可以做同样的事情。虽然对于这个例子来说,它真的是太夸张了。我也不特别推荐这个。
WITH myconstants (var1, var2) as (
values (5, 'foo')
)
SELECT *
FROM somewhere, myconstants
WHERE something = var1
OR something_else = var2;
我想对@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;
这取决于你的客户。
然而,如果你正在使用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';
下面是一个使用PREPARE语句的例子。你仍然不能使用?,但你可以使用$n符号:
PREPARE foo(integer) AS
SELECT *
FROM somewhere
WHERE something = $1;
EXECUTE foo(5);
DEALLOCATE foo;
你也可以在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或更高版本。