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() + INTERVAL '1 day';
SELECT * from birthday WHERE date < $from AND date > $to;
我尝试按照this questionSELECT INTO
中的建议使用,但这不是我想要的,因为它创建一个完整的数据库表只是为了保存变量,即使在使用参数时在以后的会话中重用它也会导致错误。它说“关系已经存在”!我还尝试了一些美元符号语法和一些冒号+等号语法,但都没有TEMP
$
:=
解决方案
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 之类的语言。
推荐阅读
- c - 用 C 中的数组制作一个按字母顺序排列的字母计数器
- spring-boot - 云和本地部署的不同工件
- c# - 尝试在自定义方法的返回值上调用 ThenInclude
- arrays - SwiftUI 按 id 对自定义对象数组进行排序
- python-3.x - 映射以创建虚拟变量
- php - 在 Heroku 上使用 React js 应用程序部署 Symfony 4
- java - java.lang.NoSuchMethodError: org.hamcrest.beans.SamePropertyValuesAs.isNotNull(Ljava/lang/Object;Lorg/hamcrest/Description;)
- javascript - 为 JSON 对象创建临时变量
- google-cloud-platform - 如何将多字字符串作为参数传递给 Google BigQuery 中的 bq 查询命令?
- c# - PropertyChangedEventManager - 调用 RemoveHandler 失败会导致泄漏吗?