Verschillende opties.
Geef parameters op in een CTE om "variabelen" te hebben in pure SQL :
WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM users, var v
WHERE lastname = v.lastname;
Dit werkt voor elke query.
Sinds de CTE var
heeft een enkele rij het is veilig om het toe te voegen met een CROSS JOIN
aan het einde van de FROM-clausule - eigenlijk is de korte vorm met het toevoegen ervan na een komma misschien het beste omdat expliciete join-syntaxis bindt vóór komma's. De extra tabelalias v
is optioneel om de syntaxis verder in te korten.
OF goedkoper zonder CTE. Trouwens, waarom varchar(16)
? Gebruik gewoon text
:
SELECT *
FROM users
JOIN (SELECT 'Troy'::text) var(lastname) USING (lastname)
WHERE lastname = var.lastname;
Of gebruik een tijdelijke tabel om een vergelijkbare rol te spelen voor allen vragen binnen dezelfde sessie. Tijdelijke tafels sterven aan het einde van de sessie.
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);
- Over tijdelijke tabellen en
autovacuum
Of je kunt DO
. gebruiken uitspraken zoals @Houari geleverd of zoals hier gedemonstreerd:
- PostgreSQL maakt een loop buiten functies. Is dat mogelijk?
Merk op dat u geen waarden kunt retourneren van DO
verklaringen. (U kunt RAISE ...
gebruiken hoewel.) En je kunt SELECT
. niet gebruiken zonder doel in plpgsql - de standaard proceduretaal in een DO
uitspraak. Vervang SELECT
met PERFORM
om resultaten weg te gooien.
Of u kunt aangepaste opties gebruiken , die u kunt instellen in postgresql.conf
zichtbaar zijn wereldwijd .
Of ingesteld in uw sessie om zichtbaar te zijn voor de duur van de sessie en alleen in dezelfde sessie :
SET my.lastname = 'Troy';
De variabelenaam moet een punt invoegen. Je bent beperkt tot text
op deze manier als gegevenstype, maar elk gegevenstype kan worden weergegeven als text
...
U kunt current_setting('my.lastname')
. gebruiken als waarde-uitdrukking. Cast als je nodig hebt. Bijvoorbeeld:current_setting('my.json_var')::json
...
Of gebruik SET LOCAL
zodat het effect alleen geldt voor de huidige transactie . Zie:
- Gebruikers-ID doorgeven aan PostgreSQL-triggers
Of je kunt het kleine IMMUTABLE
. gebruiken functies als algemeen persistente variabelen die alleen bevoorrechte gebruikers kunnen manipuleren. Zie:
- Is er een manier om een benoemde constante in een PostgreSQL-query te definiëren?
Of wanneer u met psql als client werkt, gebruikt u de \set
of \gset
meta-commando's en variabele vervanging.