我如何在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;
谁能给我一个正确语法的例子吗?
当前回答
下面是在postges终端中使用普通变量的代码段。我用过几次。但得想个更好的办法。这里我正在使用字符串变量。使用整型变量时,不需要三引号。三引号在查询时变成单引号;否则就会出现语法错误。在处理字符串变量时,可能有一种方法可以消除对三引号的需求。如果你找到了改进的方法,请及时更新。
\set strainname '''B.1.1.7'''
select *
from covid19strain
where name = :strainname ;
其他回答
你也可以在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或更高版本。
下面是在postges终端中使用普通变量的代码段。我用过几次。但得想个更好的办法。这里我正在使用字符串变量。使用整型变量时,不需要三引号。三引号在查询时变成单引号;否则就会出现语法错误。在处理字符串变量时,可能有一种方法可以消除对三引号的需求。如果你找到了改进的方法,请及时更新。
\set strainname '''B.1.1.7'''
select *
from covid19strain
where name = :strainname ;
我想对@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;
的确,没有明确的方式来声明单值变量,你能做的是
with myVar as (select "any value really")
然后,要访问存储在这个结构中的值,就必须这样做
(select * from myVar)
例如
with var as (select 123)
... where id = (select * from var)
在pl/PgSQL之外使用临时表
除了使用pl/pgsql或其他建议的pl/*语言之外,这是我能想到的唯一其他可能性。
begin;
select 5::int as var into temp table myvar;
select *
from somewhere s, myvar v
where s.something = v.var;
commit;