Různé možnosti.
Zadejte parametry v CTE, abyste měli "proměnné" v čistém SQL :
WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM users, var v
WHERE lastname = v.lastname;
Toto funguje pro jakékoli dotazu.
Od CTE var
obsahuje jeden řádek je bezpečné jej připojit pomocí CROSS JOIN
na konci klauzule FROM - vlastně krátká forma s připojením za čárkou může být nejlepší, protože explicitní syntaxe spojení se váže před čárkami. Alias doplňkové tabulky v
je volitelný pro další zkrácení syntaxe.
NEBO levnější bez CTE. BTW, proč varchar(16)
? Stačí použít text
:
SELECT *
FROM users
JOIN (SELECT 'Troy'::text) var(lastname) USING (lastname)
WHERE lastname = var.lastname;
Nebo použijte dočasnou tabulku hrát podobnou roli pro všechny dotazy v rámci stejné relace. Dočasné tabulky umírají s koncem relace.
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);
- O dočasných tabulkách a
autovacuum
Nebo můžete použít DO
prohlášení jako @Houari dodaná nebo podobná zde:
- PostgreSQL zacyklí vnější funkce. Je to možné?
Všimněte si, že nemůžete vrátit hodnoty z DO
prohlášení. (Můžete použít RAISE ...
ačkoli.) A nemůžete použít SELECT
bez cíle v plpgsql - výchozí procedurální jazyk v DO
prohlášení. Nahraďte SELECT
s PERFORM
zahodit výsledky.
Nebo můžete použít přizpůsobené možnosti , kterou můžete nastavit v postgresql.conf
být viditelný globálně .
Nebo nastavit v relaci tak, aby byla viditelná po dobu trvání relace a pouze ve stejné relaci :
SET my.lastname = 'Troy';
Název proměnné musí obsahovat tečku. Jste omezeni na text
jako datový typ tímto způsobem, ale jakýkoli datový typ může být reprezentován jako text
...
Můžete použít current_setting('my.lastname')
jako vyjádření hodnoty. Cast, pokud potřebujete. Například:current_setting('my.json_var')::json
...
Nebo použijte SET LOCAL
aby efekt trval pouze pro aktuální transakci . Viz:
- Předávání ID uživatele spouštěčům PostgreSQL
Nebo můžete použít malý IMMUTABLE
funkce jako globální trvalé proměnné, se kterými mohou manipulovat pouze privilegovaní uživatelé. Viz:
- Existuje způsob, jak definovat pojmenovanou konstantu v dotazu PostgreSQL?
Nebo při práci s psql jako klientem použijte \set
nebo \gset
meta-příkazy a substituce proměnných.