Różne opcje.
Podaj parametry w CTE, aby mieć „zmienne” w czystym SQL :
WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM users, var v
WHERE lastname = v.lastname;
Działa to dla każdego zapytanie.
Ponieważ CTE var
przechowuje pojedynczy wiersz bezpiecznie jest dołączyć do niego CROSS JOIN
na końcu klauzuli FROM - właściwie krótka forma z dołączeniem jej po przecinku może być najlepsza, ponieważ jawna składnia łączenia wiąże się przed przecinkami. Dodatkowy alias tabeli v
jest opcjonalne, aby jeszcze bardziej skrócić składnię.
LUB taniej bez CTE. BTW, dlaczego varchar(16)
? Po prostu użyj text
:
SELECT *
FROM users
JOIN (SELECT 'Troy'::text) var(lastname) USING (lastname)
WHERE lastname = var.lastname;
Lub użyj tabeli tymczasowej odgrywać podobną rolę dla wszystkich zapytania w ramach tej samej sesji. Tabele tymczasowe umierają wraz z końcem sesji.
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);
- Informacje o tabelach tymczasowych i
autovacuum
Lub możesz użyć DO
oświadczenia takie jak @Houari dostarczone lub przedstawione tutaj:
- Pętle PostgreSQL poza funkcjami. Czy to możliwe?
Pamiętaj, że nie możesz zwrócić wartości z DO
sprawozdania. (Możesz użyć RAISE ...
chociaż.) I nie możesz użyć SELECT
bez celu w plpgsql - domyślny język proceduralny w DO
oświadczenie. Zastąp SELECT
z PERFORM
wyrzucać wyniki.
Lub możesz użyć dostosowanych opcji , który możesz ustawić w postgresql.conf
być widocznym globalnie .
Lub ustawić w sesji, aby była widoczna przez cały czas trwania sesji i tylko w tej samej sesji :
SET my.lastname = 'Troy';
Nazwa zmiennej musi zawierać kropkę. Jesteś ograniczony do text
jako typ danych w ten sposób, ale każdy typ danych może być reprezentowany jako text
...
Możesz użyć current_setting('my.lastname')
jako wyrażenie wartości. Przesyłaj, jeśli potrzebujesz. Na przykład:current_setting('my.json_var')::json
...
Lub użyj SET LOCAL
aby efekt trwał tylko dla bieżącej transakcji . Zobacz:
- Przekazywanie identyfikatora użytkownika do wyzwalaczy PostgreSQL
Lub możesz użyć małego IMMUTABLE
funkcje jako globalny utrwalone zmienne, którymi mogą manipulować tylko uprzywilejowani użytkownicy. Zobacz:
- Czy istnieje sposób na zdefiniowanie nazwanej stałej w zapytaniu PostgreSQL?
Lub podczas pracy z psql jako klientem, użyj \set
lub \gset
metapolecenia i podstawianie zmiennych.