如何在PostgreSQL中保存临时会话变量
假设我有一个简单的SQL语句,如下所示:如何在PostgreSQL中保存临时会话变量,sql,postgresql,Sql,Postgresql,假设我有一个简单的SQL语句,如下所示: SELECT * from birthday WHERE date < now() + INTERVAL '1 day' AND date > now() - INTERVAL '1 day'; 但是From和To变量的方程要比这复杂得多。我将在多个查询中重用这些方程的结果。那么,我可以像在任何编程语言中那样临时存储它们吗?我想象的是: $from := now() - INTERVAL '1 day'; $to:= now() + INT
SELECT * from birthday WHERE date < now() + INTERVAL '1 day' AND date > now() - INTERVAL '1 day';
但是From和To变量的方程要比这复杂得多。我将在多个查询中重用这些方程的结果。那么,我可以像在任何编程语言中那样临时存储它们吗?我想象的是:
$from := now() - INTERVAL '1 day';
$to:= now() + INTERVAL '1 day';
SELECT * from birthday WHERE date < $from AND date > $to;
我尝试按照中的建议使用SELECT INTO,但这不是我想要的,因为它创建一个完整的数据库表只是为了保存变量,这在以后的会话中重用它时也会导致错误,即使在使用TEMP参数时也是如此。它说关系已经存在了!
我还尝试了一些美元符号$syntax和冒号+equal:=syntax,但都不起作用。SQL不是任何编程语言。如果要存储这些值以便在一个查询中重复使用,则可以使用CTE:
WITH params as (
SELECT now() - INTERVAL '1 day' as _from,
now() + INTERVAL '1 day' as _to
)
SELECT *
FROM params CROSS JOIN
birthday b
WHERE date < params._to AND date > params._from;
如果要在多个查询中重复此操作,我建议使用一个临时表:
CREATE TEMPORARY TABLE params AS
SELECT now() - INTERVAL '1 day' as _from,
now() + INTERVAL '1 day' as _to;
SELECT *
FROM params CROSS JOIN
birthday b
WHERE date < params._to AND date > params._from;
您还可以将代码封装在过程/函数中。或者使用某种脚本语言或Python之类的语言