首页 > 解决方案 > 如何在 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() + INTERVAL '1 day';
SELECT * from birthday WHERE date < $from AND date > $to;

我尝试按照this questionSELECT INTO中的建议使用,但这不是我想要的,因为它创建一个完整的数据库表只是为了保存变量,即使在使用参数时在以后的会话中重用它也会导致错误。它说“关系已经存在”!我还尝试了一些美元符号语法和一些冒号+等号语法,但都没有TEMP$:=

标签: sqlpostgresql

解决方案


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 之类的语言。


推荐阅读