在 RedShift 中声明一个变量
Declare a variable in RedShift
SQL Server
可以声明一个变量,然后像这样在查询中调用该变量:
DECLARE @StartDate date;
SET @StartDate = '2015-01-01';
SELECT *
FROM Orders
WHERE OrderDate >= @StartDate;
此功能在 Amazon 的 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
中执行此操作?
不,Amazon Redshift 没有变量的概念。 Redshift 将自己呈现为 PostgreSQL,但经过了高度修改。
2014 AWSre:Invent大会上提到了User Defined Functions,这可能会满足您的一些需求。
2016年更新:标量User Defined Functions可以执行计算但不能作为存储变量。
请注意,如果您使用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)
您现在可以使用用户定义的函数 (UDF) 来执行您想要的操作:
CREATE FUNCTION my_const()
RETURNS CSTRING IMMUTABLE AS
$$ return 'my_string_constant' $$ language plpythonu;
不幸的是,这确实需要 certain access permissions 在您的 redshift 数据库上。
实际上,您可以临时使用一个变量来模拟一个变量table,创建一个,设置数据就可以了。
像这样:
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);
临时table将在事务执行后删除。
Temp tables 绑定每个会话(连接),因此不能跨会话共享。
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);
SQL Server
可以声明一个变量,然后像这样在查询中调用该变量:
DECLARE @StartDate date;
SET @StartDate = '2015-01-01';
SELECT *
FROM Orders
WHERE OrderDate >= @StartDate;
此功能在 Amazon 的 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
中执行此操作?
不,Amazon Redshift 没有变量的概念。 Redshift 将自己呈现为 PostgreSQL,但经过了高度修改。
2014 AWSre:Invent大会上提到了User Defined Functions,这可能会满足您的一些需求。
2016年更新:标量User Defined Functions可以执行计算但不能作为存储变量。
请注意,如果您使用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)
您现在可以使用用户定义的函数 (UDF) 来执行您想要的操作:
CREATE FUNCTION my_const()
RETURNS CSTRING IMMUTABLE AS
$$ return 'my_string_constant' $$ language plpythonu;
不幸的是,这确实需要 certain access permissions 在您的 redshift 数据库上。
实际上,您可以临时使用一个变量来模拟一个变量table,创建一个,设置数据就可以了。
像这样:
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);
临时table将在事务执行后删除。
Temp tables 绑定每个会话(连接),因此不能跨会话共享。
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);