在RedShift中声明一个变量

时间:2015-06-13 18:32:27

标签: amazon-redshift

SQL Server能够声明变量,然后在查询中调用该变量,如下所示:

DECLARE @StartDate date;
SET @StartDate = '2015-01-01';

SELECT *
FROM Orders
WHERE OrderDate >= @StartDate;

此功能是否适用于亚马逊的RedShift?从documentation开始,DECLARE仅用于游标。 SET看起来是我正在寻找的功能,但是当我尝试使用它时,我收到了一个错误。

set session StartDate = '2015-01-01';
 [Error Code: 500310, SQL State: 42704]  [Amazon](500310) Invalid operation: unrecognized configuration parameter "startdate";

是否可以在RedShift中执行此操作?

5 个答案:

答案 0 :(得分:21)

实际上,你可以通过使用临时表来模拟变量,创建一个变量,设置数据,你就可以了。

这样的事情:

CREATE TEMP TABLE tmp_variables AS SELECT 
   '2015-01-01'::DATE AS StartDate, 
   'some string'      AS some_value,
   5556::BIGINT       AS some_id;

SELECT *
FROM Orders
WHERE OrderDate >= (SELECT StartDate FROM tmp_variables);

交易执行后将删除临时表 每个会话绑定临时表(连接),因此不能跨会话共享。

答案 1 :(得分:21)

Slavik Meltser的回答很棒。作为此主题的变体,您还可以使用WITH构造:

WITH tmp_variables AS (
SELECT 
   '2015-01-01'::DATE AS StartDate, 
   'some string'      AS some_value,
   5556::BIGINT       AS some_id
)

SELECT *
FROM Orders
WHERE OrderDate >= (SELECT StartDate FROM tmp_variables);

答案 2 :(得分:13)

不,亚马逊Redshift没有变量的概念。 Redshift本身就是PostgreSQL,但经过高度修改。

2014年AWS re:Invent会议上提到了用户定义的功能,可能会满足您的一些需求。

2016年更新:标量User Defined Functions可以执行计算但不能充当存储变量。

答案 3 :(得分:6)

请注意,如果您使用psql客户端进行查询,仍可以像往常一样使用psql变量使用Redshift:

$ psql --host=my_cluster_name.clusterid.us-east-1.redshift.amazonaws.com \
     --dbname=your_db   --port=5432 --username=your_login -v dt_format=DD-MM-YYYY

# select current_date;     
    date    
------------
 2015-06-15
(1 row)

# select to_char(current_date,:'dt_format');
  to_char   
------------
 15-06-2015
(1 row)

# \set
AUTOCOMMIT = 'on'
...
dt_format = 'DD-MM-YYYY'
...
# \set dt_format 'MM/DD/YYYY'
# select to_char(current_date,:'dt_format');
  to_char   
------------
 06/15/2015
(1 row)

答案 4 :(得分:2)

您现在可以使用用户定义的函数(UDF' s)来执行您想要的操作:

CREATE FUNCTION my_const()
    RETURNS CSTRING IMMUTABLE AS 
    $$ return 'my_string_constant' $$ language plpythonu;

不幸的是,这确实需要您的redshift数据库上的certain access permissions

相关问题