Wie deklariere ich eine Variable zur Verwendung in einer PostgreSQL 8.3-Abfrage?
In MS SQL Server kann ich Folgendes tun:
DECLARE @myvar INT
SET @myvar = 5
SELECT *
FROM somewhere
WHERE something = @myvar
Wie mache ich dasselbe in PostgreSQL? Laut Dokumentation werden Variablen einfach als "Namenstyp" deklariert, aber dies gibt mir einen Syntaxfehler:
myvar INTEGER;
Könnte mir jemand ein Beispiel für die richtige Syntax geben?
Antworten:
In PostgreSQL gibt es keine solche Funktion. Sie können dies nur in pl / PgSQL (oder einem anderen pl / *) tun, nicht jedoch in einfachem SQL.
Eine Ausnahme ist die
WITH ()
Abfrage, die als Variable oder sogartuple
von Variablen verwendet werden kann. Sie können eine Tabelle mit temporären Werten zurückgeben.quelle
Ich habe das gleiche Ziel mit einer
WITH
Klausel erreicht , sie ist bei weitem nicht so elegant, kann aber das Gleiche tun. Obwohl es für dieses Beispiel wirklich übertrieben ist. Ich empfehle dies auch nicht besonders.quelle
\set
wie in Shahriar Aghajanis Antwort vorgeschlagen verwenden.JOIN myconstants ON true
und dann besteht keine Notwendigkeit, die Unterauswahl vorzunehmen.WITH
CTE nicht für Abfragen in einer Transaktion freigeben.WITH constants AS (SELECT 5 AS var) SELECT * FROM somewhere CROSS JOIN constants WHERE someting=var;
. CROSS JOIN ist ein einzeiliger Tabellenausdruck, der die Daten für alle Zeilen in der realen Tabelle virtuell dupliziert und den Ausdruck vereinfacht.Sie können dies auch in PLPGSQL versuchen:
Für das oben Gesagte ist Postgres 9.0 oder höher erforderlich.
quelle
Dynamische Konfigurationseinstellungen
Sie können dynamische Konfigurationseinstellungen dafür "missbrauchen":
Konfigurationseinstellungen sind immer Varchar-Werte, daher müssen Sie sie bei Verwendung auf den richtigen Datentyp umwandeln. Dies funktioniert mit jedem SQL-Client, während
\set
nur inpsql
Für das oben Gesagte ist Postgres 9.2 oder höher erforderlich.
Bei früheren Versionen musste die Variable
postgresql.conf
vor der Verwendung deklariert werden, sodass ihre Verwendbarkeit etwas eingeschränkt wurde. Eigentlich nicht die Variable komplett, sondern die config "Klasse", die im Wesentlichen das Präfix ist. Sobald das Präfix definiert wurde, kann jede Variable ohne Änderung verwendet werdenpostgresql.conf
quelle
set session my.vars.id = '1';
zuset session my.user.id = '1';
ergebenERROR: syntax error at or near "user"
SET LOCAL ...
. Diesession
Variable bleibt so lange gültig, wie Ihre Verbindung besteht. Daslocal
ist auf die Transaktion beschränkt.set session "my.user.id" = '1';
Dercurrent_setting('my.user.id')
Aufruf funktioniert wie erwartet.Das hängt von Ihrem Kunden ab.
Wenn Sie jedoch den psql- Client verwenden, können Sie Folgendes verwenden:
Wenn Sie Textvariablen verwenden, müssen Sie Anführungszeichen setzen.
quelle
\set
muss klein geschrieben seindb=> \set someid 8292 db=> SELECT * FROM sometable WHERE id = :someid;
Verwenden einer Temp-Tabelle außerhalb von pl / PgSQL
Abgesehen von der vorgeschlagenen Verwendung von pl / pgsql oder einer anderen pl / * -Sprache ist dies die einzige andere Möglichkeit, die mir in den Sinn kommt.
quelle
Ich möchte eine Verbesserung der Antwort von @ DarioBarrionuevo vorschlagen , um die Nutzung temporärer Tabellen zu vereinfachen.
quelle
1
(vermutlich die Zeilenanzahl) und nicht den Inhalt von zurücktmp_table
.Diese Lösung basiert auf der von fei0x vorgeschlagenen , hat jedoch den Vorteil, dass die Werteliste der Konstanten in der Abfrage nicht verknüpft werden muss und Konstanten zu Beginn der Abfrage einfach aufgelistet werden können. Es funktioniert auch in rekursiven Abfragen.
Grundsätzlich ist jede Konstante eine Einzelwerttabelle , die in einer WITH-Klausel deklariert ist und dann an einer beliebigen Stelle im verbleibenden Teil der Abfrage aufgerufen werden kann.
Alternativ können Sie
SELECT * FROM constant_name
stattdessen verwenden,TABLE constant_name
was möglicherweise nicht für andere Abfragesprachen gültig ist, die sich von postgresql unterscheiden.quelle
Hier ist ein Beispiel mit PREPARE-Anweisungen . Sie können immer noch nicht verwenden
?
, aber Sie können$n
Notation verwenden:quelle
Es gibt zwar keine anschauliche und eindeutige Möglichkeit, eine einwertige Variable zu deklarieren. Sie können dies jedoch tun
Um dann Zugriff auf den in dieser Konstruktion gespeicherten Wert zu erhalten, müssen Sie dies tun
beispielsweise
quelle
Sie können auf spezielle Werkzeugfunktionen zurückgreifen. Wie für DBeaver eigene proprietäre Syntax:
quelle
In DBeaver können Sie Parameter in Abfragen genau wie aus Code verwenden. Dies funktioniert also:
Wenn Sie die Abfrage ausführen, werden Sie von DBeaver nach dem Wert für: myvar gefragt und die Abfrage ausgeführt.
quelle