PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So testen Sie mein Ad-hoc-SQL mit Parametern im Postgres-Abfragefenster

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.