Объявить переменную в 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?

Ответы

Ответ 1

Нет, Amazon Redshift не имеет понятия переменных. Redshift представляет собой PostgreSQL, но сильно изменен.

На конференции 2014 AWS re: Invent была отмечена функция User Defined Functions, которая может удовлетворить некоторые ваши потребности.

Обновление в 2016 году. Скалярные пользовательские функции могут выполнять вычисления, но не могут действовать как хранимые переменные.

Ответ 2

На самом деле, вы можете смоделировать переменную, используя временную таблицу, создать ее, установить данные, и все готово.

Что-то вроде этого:

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

Временная таблица будет удалена после выполнения транзакции.
Временные таблицы связаны для каждого сеанса (соединения), поэтому не могут быть разделены между сеансами.

Ответ 3

Ответ Славика Мельцера велик. В качестве варианта этой темы вы также можете использовать конструкцию 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);

Ответ 4

Обратите внимание: если вы используете клиент 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)

Ответ 5

Теперь вы можете использовать определенные пользователем функции (UDF), чтобы делать то, что вы хотите:

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

К сожалению, для этого требуются определенные разрешения на доступ к вашей базе данных красного смещения.