Forskellige muligheder.
Angiv parametre i en CTE for at have "variabler" i ren SQL :
WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM users, var v
WHERE lastname = v.lastname;
Dette virker for alle forespørgsel.
Siden CTE var
har en enkelt række det er sikkert at tilføje det med en CROSS JOIN
i slutningen af FROM-sætningen - faktisk er den korte form med tilføjelse efter et komma bedst, fordi eksplicit joinsyntaks binder før kommaer. Det ekstra tabelalias v
er valgfrit for yderligere at forkorte syntaksen.
ELLER billigere uden CTE. BTW, hvorfor varchar(16)
? Brug bare text
:
SELECT *
FROM users
JOIN (SELECT 'Troy'::text) var(lastname) USING (lastname)
WHERE lastname = var.lastname;
Eller brug en midlertidig tabel at spille en lignende rolle for alle forespørgsler inden for samme session. Temp-tabeller dør med slutningen af 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 midlertidige tabeller og
autovacuum
Eller du kan bruge DO
udsagn som @Houari leveret eller lignende demonstreret her:
- PostgreSQL sløjfer eksterne funktioner. Er det muligt?
Bemærk, at du ikke kan returnere værdier fra DO
udsagn. (Du kan bruge RAISE ...
dog.) Og du kan ikke bruge SELECT
uden mål i plpgsql - standardsprogsproget i en DO
udmelding. Erstat SELECT
med PERFORM
at smide resultater væk.
Eller du kan bruge tilpassede muligheder , som du kan indstille i postgresql.conf
at være synlig globalt .
Eller indstillet i din session til at være synlig i hele sessionens varighed og kun i samme session :
SET my.lastname = 'Troy';
Variabelnavnet skal inkludere en prik. Du er begrænset til text
som datatype på denne måde, men enhver datatype kan repræsenteres som text
...
Du kan bruge current_setting('my.lastname')
som værdiudtryk. Cast hvis du har brug for. For eksempel:current_setting('my.json_var')::json
...
Eller brug SET LOCAL
for at effekten kun varer ved den aktuelle transaktion . Se:
- Videregivelse af bruger-id til PostgreSQL-udløsere
Eller du kan bruge lille IMMUTABLE
funktioner som global persisterede variabler, som kun privilegerede brugere kan manipulere. Se:
- Er der en måde at definere en navngivet konstant i en PostgreSQL-forespørgsel?
Eller når du arbejder med psql som klient, skal du bruge \set
eller \gset
meta-kommandoer og variabel substitution.