我想在我的查询中有一个变量。
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'::日期作为目标日期;
Redshift 不支持变量。如果您的用例是要在多个子查询中使用一个特定值,最简单的选择是使用通用表表达式,例如
with myvariables as (
SELECT '2023-02-21'::DATE AS TargetDate
)
select *
from mytable
where targetdate = (select TargetDate from myvariables)
另请参阅 在 RedShift 中声明变量
Amazon Redshift 中没有“变量”的概念。
您收到的错误是因为您尝试创建另一个同名的表。
某些 SQL 客户端(例如 DBeaver)允许您在 SQL 中放置
?
占位符。当 SQL 查询运行时,客户端将提示您输入一个值。 Amazon Redshift 接收已就地替换变量的查询。因此,可以为您处理变量的是 SQL 客户端,而不是数据库引擎(在您的情况下为 Amazon Redshift)。
正如您所知,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 条语句,您可以根据需要更改临时表内容。
Redshift 似乎添加了执行此操作的功能,尽管它隐藏在文档中。您可以使用自定义上下文变量和
app_context
。它的持续时间与创建它的会话一样长。详细信息隐藏在 SET 文档 和 CURRENT_SETTING 文档 的底部。
这是一个例子:
SET app_context.my_variable TO 89;
SELECT * FROM table WHERE id = CURRENT_SETTING('app_context.my_variable')