Olika alternativ.
Ange parametrar i en CTE för att ha "variabler" i ren SQL :
WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM users, var v
WHERE lastname = v.lastname;
Detta fungerar för alla fråga.
Sedan CTE var
har en en rad det är säkert att lägga till den med en CROSS JOIN
i slutet av FROM-satsen - faktiskt den korta formen med att lägga till den efter ett kommatecken kan vara bäst eftersom explicit join-syntax binder före kommatecken. Tilläggstabellaliaset v
är valfritt för att ytterligare förkorta syntaxen.
ELLER billigare utan CTE. BTW, varför varchar(16)
? Använd bara text
:
SELECT *
FROM users
JOIN (SELECT 'Troy'::text) var(lastname) USING (lastname)
WHERE lastname = var.lastname;
Eller använd en tillfällig tabell att spela en liknande roll för alla frågor inom samma session. Temp-tabeller dör i slutet av sessionen.
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);
- Om tillfälliga tabeller och
autovacuum
Eller du kan använda DO
uttalanden som @Houari tillhandahåller eller liknande visas här:
- PostgreSQL loopar externa funktioner. Är det möjligt?
Observera att du inte kan returnera värden från DO
uttalanden. (Du kan använda RAISE ...
dock.) Och du kan inte använda SELECT
utan mål i plpgsql - standardprocedurspråket i en DO
påstående. Ersätt SELECT
med PERFORM
att kasta bort resultat.
Eller du kan använda anpassade alternativ , som du kan ställa in i postgresql.conf
att vara synlig globalt .
Eller ställ in i din session för att vara synlig under sessionens varaktighet och endast i samma session :
SET my.lastname = 'Troy';
Variabelnamnet måste inkludera en prick. Du är begränsad till text
som datatyp på detta sätt, men vilken datatyp som helst kan representeras som text
...
Du kan använda current_setting('my.lastname')
som värdeuttryck. Kasta om du behöver. Till exempel:current_setting('my.json_var')::json
...
Eller använd SET LOCAL
för att effekten bara ska vara för den aktuella transaktionen . Se:
- Överför användar-id till PostgreSQL-utlösare
Eller du kan använda små IMMUTABLE
funktioner som global bestående variabler som endast privilegierade användare kan manipulera. Se:
- Finns det något sätt att definiera en namngiven konstant i en PostgreSQL-fråga?
Eller när du arbetar med psql som klient, använd \set
eller \gset
meta-kommandon och variabelsubstitution.