Verschiedene Optionen.
Geben Sie Parameter in einem CTE an, um "Variablen" in reinem SQL zu haben :
WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM users, var v
WHERE lastname = v.lastname;
Dies funktioniert für alle Abfrage.
Da der CTE var
enthält eine einzelne Zeile es ist sicher, es mit einem CROSS JOIN
anzuhängen am Ende der FROM-Klausel - eigentlich ist die Kurzform mit Anhängen nach einem Komma am besten, da die explizite Join-Syntax vor Kommas bindet. Der zusätzliche Tabellenalias v
ist optional, um die Syntax weiter zu verkürzen.
ODER billiger ohne CTE. Übrigens, warum varchar(16)
? Verwenden Sie einfach text
:
SELECT *
FROM users
JOIN (SELECT 'Troy'::text) var(lastname) USING (lastname)
WHERE lastname = var.lastname;
Oder Verwenden Sie eine temporäre Tabelle eine ähnliche Rolle für alle zu spielen Abfragen innerhalb derselben Sitzung. Temporäre Tabellen sterben mit dem Ende der Session.
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);
- Über temporäre Tabellen und
autovacuum
Oder Sie können DO
verwenden Anweisungen wie @Houari bereitgestellt oder wie hier gezeigt:
- PostgreSQL-Schleifen außerhalb von Funktionen. Ist das möglich?
Beachten Sie, dass Sie keine Werte von DO
zurückgeben können Aussagen. (Sie können RAISE ...
verwenden obwohl.) Und Sie können SELECT
nicht verwenden ohne Ziel in plpgsql - die standardmäßige prozedurale Sprache in einem DO
Erklärung. Ersetzen Sie SELECT
mit PERFORM
um Ergebnisse wegzuwerfen.
Oder Sie können benutzerdefinierte Optionen verwenden , die Sie in postgresql.conf
festlegen können weltweit sichtbar sein .
Oder in Ihrer Sitzung so eingestellt, dass sie für die Dauer der Sitzung und nur in derselben Sitzung sichtbar sind :
SET my.lastname = 'Troy';
Der Variablenname muss einen Punkt enthalten. Sie sind auf text
beschränkt als Datentyp auf diese Weise, aber jeder Datentyp kann als text
dargestellt werden ...
Sie können current_setting('my.lastname')
verwenden als Werteausdruck. Gießen Sie, wenn Sie brauchen. Beispiel:current_setting('my.json_var')::json
...
Oder Verwenden Sie SET LOCAL
damit der Effekt nur für die aktuelle Transaktion anhält . Siehe:
- Benutzer-ID an PostgreSQL-Trigger übergeben
Oder Sie können winzige IMMUTABLE
verwenden Funktionen als global persistente Variablen, die nur privilegierte Benutzer bearbeiten können. Siehe:
- Gibt es eine Möglichkeit, eine benannte Konstante in einer PostgreSQL-Abfrage zu definieren?
Oder Wenn Sie mit psql als Client arbeiten, verwenden Sie \set
oder \gset
Metabefehle und Variablenersetzung.