Redshift 中的变量

问题描述 投票:0回答:4

我想在我的查询中有一个变量。

CREATE TEMP TABLE tmp_date_var AS SELECT 
   '2023-02-21'::DATE AS TargetDate;  

然后我在我的(长)查询中使用它,其中 TargetDate 经常出现。

第一次运行成功,然后我将TargetDate更改为'2023-02-20',我收到错误: “错误:关系“tmp_date_var”已存在” 并且 TargetDate 仍为“2023-02-21”。

如何解决?

提前非常感谢!

创建临时表 tmp_date_var 作为选择 '2023-02-21'::日期作为目标日期;

sql amazon-web-services variables amazon-redshift
4个回答
0
投票

Redshift 不支持变量。如果您的用例是要在多个子查询中使用一个特定值,最简单的选择是使用通用表表达式,例如

with myvariables as (
    SELECT '2023-02-21'::DATE AS TargetDate
)
select *
from mytable
where targetdate = (select TargetDate from myvariables) 

另请参阅 在 RedShift 中声明变量


0
投票

Amazon Redshift 中没有“变量”的概念。

您收到的错误是因为您尝试创建另一个同名的表。

某些 SQL 客户端(例如 DBeaver)允许您在 SQL 中放置

?
占位符。当 SQL 查询运行时,客户端将提示您输入一个值。 Amazon Redshift 接收已就地替换变量的查询。因此,可以为您处理变量的是 SQL 客户端,而不是数据库引擎(在您的情况下为 Amazon Redshift)。


0
投票

正如您所知,Redshift 中没有变量,但某些工作台能够在 SQL 发送到数据库之前进行变量替换。

要解决临时表错误,您可以在重新创建它之前删除该表。在设置值之前始终确保临时表不存在:

DROP TABLE IF EXISTS tmp_date_var; CREATE TEMP TABLE tmp_date_var AS SELECT '2023-02-21'::DATE AS TargetDate;

运行这 2 条语句,而不是只运行 1 条语句,您可以根据需要更改临时表内容。


0
投票

Redshift 似乎添加了执行此操作的功能,尽管它隐藏在文档中。您可以使用自定义上下文变量和

app_context
。它的持续时间与创建它的会话一样长。详细信息隐藏在 SET 文档CURRENT_SETTING 文档 的底部。

这是一个例子:

SET app_context.my_variable TO 89;
SELECT * FROM table WHERE id = CURRENT_SETTING('app_context.my_variable')
© www.soinside.com 2019 - 2024. All rights reserved.