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.