我如何在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;
谁能给我一个正确语法的例子吗?
当前回答
这取决于你的客户。
然而,如果你正在使用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';
其他回答
下面是在postges终端中使用普通变量的代码段。我用过几次。但得想个更好的办法。这里我正在使用字符串变量。使用整型变量时,不需要三引号。三引号在查询时变成单引号;否则就会出现语法错误。在处理字符串变量时,可能有一种方法可以消除对三引号的需求。如果你找到了改进的方法,请及时更新。
\set strainname '''B.1.1.7'''
select *
from covid19strain
where name = :strainname ;
的确,没有明确的方式来声明单值变量,你能做的是
with myVar as (select "any value really")
然后,要访问存储在这个结构中的值,就必须这样做
(select * from myVar)
例如
with var as (select 123)
... where id = (select * from var)
你也可以在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中,你可以使用这些“变量”作为宏。请注意,它们在每次使用时都被“计算”,而不是在“设置”时。
简单的例子:
\set my_random '(SELECT random())'
select :my_random; -- gives 0.23330629315990592
select :my_random; -- gives 0.67458399344433542
这样每次都会给出两个不同的答案。
但是,您仍然可以使用这些有价值的简写来避免重复大量的子选择。
\set the_id '(SELECT id FROM table_1 WHERE name = ''xxx'' LIMIT 1)'
然后在以后的查询中使用它
:the_id
e.g.
INSERT INTO table2 (table1_id,x,y,z) VALUES (:the_id, 1,2,3)
注意,你必须对变量中的字符串加双引号,因为整件事都是字符串插值(即宏展开)到你的查询中。
在DBeaver中,你可以在查询中使用参数,就像在代码中一样,所以这是可以工作的:
SELECT *
FROM somewhere
WHERE something = :myvar
当你运行查询时,DBeaver会问你:myvar的值并运行查询。