Различни опции.
Предоставете параметри в CTE, за да имате „променливи“ в чист SQL :
WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM users, var v
WHERE lastname = v.lastname;
Това работи за всяко заявка.
Тъй като CTE var
съдържа единичен ред безопасно е да го добавите с CROSS JOIN
в края на клаузата FROM - всъщност кратката форма с добавянето й след запетая може да е най-добра, защото изричният синтаксис на присъединяване се свързва преди запетаи. Допълнителният псевдоним на таблицата v
е по избор за допълнително съкращаване на синтаксиса.
ИЛИ по-евтино без CTE. BTW, защо varchar(16)
? Просто използвайте text
:
SELECT *
FROM users
JOIN (SELECT 'Troy'::text) var(lastname) USING (lastname)
WHERE lastname = var.lastname;
Или използвайте временна таблица да играе подобна роля за всички запитвания в рамките на същата сесия. Временните таблици умират с края на сесията.
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);
- Относно временните таблици и
autovacuum
Или можете да използвате DO
изявления като @Houari предоставени или като демонстрирани тук:
- PostgreSQL зацикля извън функциите. Възможно ли е това?
Имайте предвид, че не можете да върнете стойности от DO
изявления. (Можете да използвате RAISE ...
все пак.) И не можете да използвате SELECT
без цел в plpgsql - процедурният език по подразбиране в DO
изявление. Заменете SELECT
с PERFORM
за да изхвърлите резултатите.
Или можете да използвате персонализирани опции , който можете да зададете в postgresql.conf
да бъдат видимиглобално .
Или настройте в сесията си да се вижда по време на сесията и само в същата сесия :
SET my.lastname = 'Troy';
Името на променливата трябва включва точка. Вие сте ограничени до text
като тип данни по този начин, но всеки тип данни може да бъде представен като text
...
Можете да използвате current_setting('my.lastname')
като стойностен израз. Изпратете, ако имате нужда. Например:current_setting('my.json_var')::json
...
Или използвайте SET LOCAL
за да продължи ефектът само за текущата транзакция . Вижте:
- Предаване на потребителски идентификатор към задействания на PostgreSQL
Или можете да използвате мини IMMUTABLE
функциите като глобален постоянни променливи, които само привилегировани потребители могат да манипулират. Вижте:
- Има ли начин да се дефинира именувана константа в PostgreSQL заявка?
Или когато работите с psql като клиент, използвайте \set
или \gset
мета-команди и заместване на променливи.