我如何在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;
谁能给我一个正确语法的例子吗?
当前回答
PostgreSQL中没有这样的特性。您只能在pl/PgSQL(或其他pl/*)中这样做,但不能在纯SQL中这样做。
一个例外是WITH()查询,它可以作为一个变量,甚至是变量的元组。它允许您返回临时值的表。
WITH master_user AS (
SELECT
login,
registration_date
FROM users
WHERE ...
)
SELECT *
FROM users
WHERE master_login = (SELECT login
FROM master_user)
AND (SELECT registration_date
FROM master_user) > ...;
其他回答
的确,没有明确的方式来声明单值变量,你能做的是
with myVar as (select "any value really")
然后,要访问存储在这个结构中的值,就必须这样做
(select * from myVar)
例如
with var as (select 123)
... where id = (select * from var)
PostgreSQL中没有这样的特性。您只能在pl/PgSQL(或其他pl/*)中这样做,但不能在纯SQL中这样做。
一个例外是WITH()查询,它可以作为一个变量,甚至是变量的元组。它允许您返回临时值的表。
WITH master_user AS (
SELECT
login,
registration_date
FROM users
WHERE ...
)
SELECT *
FROM users
WHERE master_login = (SELECT login
FROM master_user)
AND (SELECT registration_date
FROM master_user) > ...;
在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;
你也可以在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或更高版本。
在DBeaver中,你可以在查询中使用参数,就像在代码中一样,所以这是可以工作的:
SELECT *
FROM somewhere
WHERE something = :myvar
当你运行查询时,DBeaver会问你:myvar的值并运行查询。