web-dev-qa-db-ja.com

RedShiftで変数を宣言する

SQL Serverは変数を宣言し、クエリでその変数を次のように呼び出すことができます。

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

SELECT *
FROM Orders
WHERE OrderDate >= @StartDate;

この機能はAmazonのRedShiftで機能しますか? ドキュメント から、DECLAREはカーソル専用に使用されているように見えます。 SETは探している関数のようですが、それを使用しようとするとエラーが発生します。

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

RedShiftでこれを行うことは可能ですか?

25
mikebmassey

いいえ、Amazon Redshiftには変数の概念はありません。 RedshiftはPostgreSQLとして表示されますが、大幅に変更されています。

2014 AWS re:Inventカンファレンスでユーザー定義関数に関する言及がありましたが、これはあなたのニーズのいくつかを満たすかもしれません。

2016年の更新:スカラー ユーザー定義関数 は計算を実行できますが、保存された変数として機能することはできません。

13
John Rotenstein

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);
26
Johan Lammens

実際には、一時テーブルを使用して変数をシミュレートし、作成して、データを設定することができます。

このようなもの:

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);

一時テーブルは、トランザクションの実行後に削除されます。
Tempテーブルはセッション(バインド)ごとにバインドされるため、セッション間で共有することはできません。

21
Slavik Meltser

クエリにpsqlクライアントを使用している場合、Redshiftでは常にpsql変数を使用できることに注意してください。

$ 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)
7
DogBoneBlues

ユーザー定義関数(UDF)を使用して、必要なことを実行できるようになりました。

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

残念ながら、これにはredshiftデータベースで 特定のアクセス許可 が必要です。

2
nbubis