Varie opzioni.
Fornisci parametri in un CTE per avere "variabili" in SQL puro :
WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM users, var v
WHERE lastname = v.lastname;
Funziona per qualsiasi query.
Dal CTE var
contiene una unica riga è sicuro aggiungerlo con un CROSS JOIN
alla fine della clausola FROM - in realtà la forma abbreviata con l'aggiunta dopo una virgola potrebbe essere la migliore perché la sintassi di join esplicita si lega prima delle virgole. La tabella aggiuntiva alias v
è facoltativo per abbreviare ulteriormente la sintassi.
O più conveniente senza CTE. A proposito, perché varchar(16)
? Usa semplicemente text
:
SELECT *
FROM users
JOIN (SELECT 'Troy'::text) var(lastname) USING (lastname)
WHERE lastname = var.lastname;
Oppure usa una tabella temporanea svolgere un ruolo simile per tutti interrogazioni all'interno della stessa sessione. I tavoli temporanei muoiono con la fine della sessione.
CREATE TEMP TABLE var AS
SELECT text 'Troy' AS lastname;
ANALYZE var; -- temp tables are not covered by autovacuum
SELECT * FROM users JOIN var USING (lastname);
- Informazioni sulle tabelle temporanee e
autovacuum
Oppure puoi usare DO
affermazioni come @Houari fornite o come dimostrate qui:
- PostgreSQL esegue cicli all'esterno delle funzioni. È possibile?
Nota che non puoi restituire valori da DO
dichiarazioni. (Puoi usare RAISE ...
però.) E non puoi usare SELECT
senza target in plpgsql - il linguaggio procedurale predefinito in un DO
dichiarazione. Sostituisci SELECT
con PERFORM
per buttare via i risultati.
Oppure puoi utilizzare opzioni personalizzate , che puoi impostare in postgresql.conf
essere visibili a livello globale .
Oppure impostato nella tua sessione in modo che sia visibile per la durata della sessione e solo nella stessa sessione :
SET my.lastname = 'Troy';
Il nome della variabile deve includi un punto. Sei limitato a text
come tipo di dati in questo modo, ma qualsiasi tipo di dati può essere rappresentato come text
...
Puoi usare current_setting('my.lastname')
come espressione di valore. Cast se hai bisogno. Ad esempio:current_setting('my.json_var')::json
...
Oppure usa SET LOCAL
affinché l'effetto duri solo per la transazione corrente . Vedi:
- Trasmissione dell'ID utente ai trigger di PostgreSQL
Oppure puoi usare il minuscolo IMMUTABLE
funzioni come globale variabili persistenti che solo gli utenti privilegiati possono manipolare. Vedi:
- C'è un modo per definire una costante denominata in una query PostgreSQL?
Oppure quando lavori con psql come client, usa il \set
o \gset
metacomandi e sostituzione di variabili.