PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come testare il mio SQL ad-hoc con i parametri nella finestra delle query di Postgres

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.