web-dev-qa-db-fra.com

Déclarez une variable dans RedShift

SQL Server a la capacité de déclarer une variable, puis d'appeler cette variable dans une requête comme ceci:

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

SELECT *
FROM Orders
WHERE OrderDate >= @StartDate;

Cette fonctionnalité fonctionne-t-elle dans RedShift d'Amazon? D'après la documentation , il semble que DECLARE soit utilisé uniquement pour les curseurs. SET semble être la fonction que je recherche, mais lorsque j'essaie de l'utiliser, j'obtiens une erreur.

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

Est-il possible de le faire dans RedShift?

25
mikebmassey

Non, Amazon Redshift n'a pas le concept de variables. Redshift se présente comme PostgreSQL, mais est fortement modifié.

Il a été fait mention de fonctions définies par l'utilisateur lors de la conférence AWS re: Invent 2014, qui pourrait répondre à certains de vos besoins.

Mise à jour en 2016: Scalaire Fonctions définies par l'utilisateur peut effectuer des calculs mais ne peut pas agir comme des variables stockées.

13
John Rotenstein

La réponse de Slavik Meltser est excellente. En variante de ce thème, vous pouvez également utiliser une construction 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

En fait, vous pouvez simuler une variable en utilisant une table temporairement, en créer une, définir des données et vous êtes prêt à partir.

Quelque chose comme ça:

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

La table temporaire sera supprimée après l'exécution de la transaction.
Les tables temporaires sont liées par session (connexion), elles ne peuvent donc pas être partagées entre les sessions.

21
Slavik Meltser

Notez que si vous utilisez le client psql pour interroger, les variables psql peuvent toujours être utilisées comme toujours avec 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)
7
DogBoneBlues

Vous pouvez maintenant utiliser des fonctions définies par l'utilisateur (UDF) pour faire ce que vous voulez:

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

Malheureusement, cela nécessite certaines autorisations d'accès sur votre base de données redshift.

2
nbubis