2015-06-13 26 views
13

SQL Server ha la possibilità di dichiarare una variabile, quindi chiamare quella variabile in una query in questo modo:Dichiarare una variabile in RedShift

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

SELECT * 
FROM Orders 
WHERE OrderDate >= @StartDate; 

Fa questa funzionalità lavoro RedShift di Amazon? Da documentation, sembra che DECLARE sia utilizzato esclusivamente per i cursori. SET sembra essere la funzione che sto cercando, ma quando provo a usarlo, ottengo un errore.

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

È possibile farlo in RedShift?

risposta

9

No, Amazon Redshift non ha il concetto di variabili. Redshift si presenta come PostgreSQL, ma è altamente modificato.

Si è parlato delle funzioni definite dall'utente in occasione della conferenza AWS re: Invent 2014, che potrebbe soddisfare alcune delle vostre esigenze.

Aggiornamento nel 2016: Scalare User Defined Functions può eseguire calcoli ma non può agire come variabili memorizzate.

6

Si noti che se si utilizza il client psql per interrogare, variabili psql possono ancora essere utilizzati come sempre con 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) 
+0

mod utile, grazie – piggybox

0

è ora possibile utilizzare le funzioni definite dall'utente (UDF) per fare ciò che si vuole:

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

Purtroppo, questo non richiede certain access permissions sul database redshift.

9

In realtà, è possibile simulare una variabile utilizzando una tabella temporanea, crearne una, impostare i dati e si è pronti.

Qualcosa di simile a questo:

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 tabella temporanea verranno cancellati dopo l'esecuzione dell'operazione.
Le tabelle temporanee sono associate a sessione (connessione), pertanto non possono essere condivise tra le sessioni.

5

Slavik La risposta di Meltser è ottima. Come una variazione su questo tema, è possibile anche utilizzare un costrutto CON:

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

questo è meglio nel mio caso d'uso: un sistema ETLM personalizzato che non 'explain' la seconda dichiarazione dopo creare una tabella di tempe. – Merlin

Problemi correlati